home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / tex / strunk / disk_1 / initex.lzh / initex / latex.tex < prev    next >
Encoding:
Text File  |  1990-04-03  |  286.3 KB  |  8,573 lines

  1. % LATEX VERSION 2.09 <9 Jan 1990>
  2. % Copyright (C) 1988 by Leslie Lamport
  3.  
  4. \everyjob{\typeout{LaTeX Version 2.09 <9 Jan 1990>}}
  5. \immediate\write10{LaTeX Version 2.09 <9 Jan 1990>}
  6.  
  7. %                 TABLE OF CONTENTS
  8. % COMMAND LIST .........................................  2
  9. % GENERAL CONVENTIONS ..................................  6
  10. % COUNTERS, ETC. .......................................  7
  11. % USEFUL HACKS .........................................  8
  12. % ERROR HANDLING ....................................... 12
  13. % \par AND \everypar ................................... 15
  14. % SPACING / LINE AND PAGE BREAKING ..................... 17
  15. % PROGRAM CONTROL STRUCTURE MACROS ..................... 21
  16. % FILE HANDLING ........................................ 24
  17. % ENVIRONMENT COUNTER MACROS ........................... 27
  18. % PAGE NUMBERING ....................................... 30
  19. % CROSS REFERENCING MACROS  ............................ 31
  20. % ENVIRONMENTS ......................................... 33
  21. % MATH ENVIRONMENTS .................................... 36
  22. % CENTER, FLUSHRIGHT, FLUSHLEFT, ETC. .................. 39
  23. % VERBATIM ............................................. 40
  24. % THE LIST ENVIRONMENT ................................. 41
  25. % ITEMIZE AND ENUMERATE ................................ 49
  26. % BOXES ................................................ 51
  27. % THE TABBING ENVIRONMENT .............................. 57
  28. % ARRAY AND TABULAR ENVIRONMENTS ....................... 63
  29. % THE PICTURE ENVIRONMENT .............................. 72
  30. % THEOREM ENVIRONMENTS ................................. 86
  31. % LENGTHS .............................................. 88
  32. % THE TITLE .............................................89
  33. % SECTIONING ........................................... 90
  34. % TABLE OF CONTENTS, ETC. .............................. 94
  35. % INDEX COMMANDS ....................................... 97
  36. % BIBLIOGRAPHY ......................................... 98
  37. % FLOATS .............................................. 100
  38. % FOOTNOTES ........................................... 106
  39. % INITIAL DECLARATION COMMANDS ........................ 110
  40. % OUTPUT .............................................. 113
  41. % DEBUGGING AND TEST INITIALIZATIONS  ................. 137
  42.  
  43.  
  44. \catcode`\~=13 \def~{\penalty\@M \ }
  45.  
  46.  
  47. %     ****************************************
  48. %     *           COMMAND LIST               *
  49. %     ****************************************
  50. %
  51. % DECLARATIONS:
  52. %  PREAMBLE:     \nofiles \documentstyle \includeonly
  53. %                \makeindex \makeglossary
  54. %  IN DOCUMENT :
  55. %    FONT SELECTION:
  56. %         SIZE: \normalsize \small \footnotesize \scriptsize \tiny
  57. %               \large \Large \LARGE \huge \Huge
  58. %         STYLE: \bf \it \rm \sl \ss \tt \mit[math mode only]
  59. %    STYLE:
  60. %         PAGE: [all global] \pagestyle \thispagestyle \pagenumbering \head
  61. %         MISC: \raggedright \thicklines \thinlines
  62. %    PARAMETER: \setlength \settowidth \addtolength \setcounter \addtocounter
  63. %    NEW:       \newlength \newtheorem \newcommand
  64. %    MISC:      \savebox \sbox \obeycr \restorecr
  65. %
  66. % ENVIRONMENTS:
  67. %    ?   -> PAR:  document
  68. %   PAR  -> PAR:  list enumerate itemize description
  69. %                 center flushright flushleft
  70. %                 verbatim picture float
  71. %   PAR  -> BOX:  tabular tabbing
  72. %   PAR  -> MATH: math displaymath equation
  73. %   MATH -> MATH: array
  74. %   ANY  -> PAR:  minipage
  75. %   ANY  -> BOX:  stack
  76. %
  77. % TEXT-PRODUCING:
  78. %   WITH TEXT ARGUMENT:
  79. %      ANY -> BOX: \makebox \mbox \framebox \fbox \dashbox
  80. %                  \shortstack \footnotemark \cite[] \raisebox
  81. %      ANY -> PAR: \parbox[inner]
  82. %      PAR -> PAR: \chapter \section ... \footnote \footnotetext
  83. %                  \topnewpage \verb
  84. %      MATH:       \sqrt \underline \overline
  85. %      PICTURE:    \put \multiput
  86. %      LIST:       \item
  87. %   WITHOUT TEXT ARGUMENT:
  88. %     ANY MODE:
  89. %          SYMBOLS: \$ \{ \} \_ \@ \& \#
  90. %          ACCENTS: See TeXbook
  91. %          OTHER:   \rule \ref \pageref \today \usebox \typein \input \cite
  92. %     MATH:     \over
  93. %     PAR MODE: \include \bibliography \tableofcontents \listoffigures ...
  94. %     LIST:     \item \arabic \roman \Roman \alph \Alph
  95. %     PICTURE:  \line \vector \circle \oval
  96. %     ARRAY & TABULAR: \hline \vline
  97. %
  98. % SPACING & BREAKING:
  99. %    ANY       : \hfill \hspace
  100. %    PAR       : \newpage \newpage \vspace \noindent
  101. %    PAR & INNER MATH
  102. %              : \newpage \clearpage \cleardoublepage
  103. %              : \pagebreak \nopagebreak \linebreak \nolinebreak \newline
  104. %    MATH      : \over \; \, \!
  105. %    MULTILINE : \\
  106. %    TABBING   : \pushtab \poptab \> \< \+ \- \kill ...
  107. %    ARRAY & TABULAR
  108. %              : \multicolumn \noalign
  109. %
  110. % NO DIRECT CHANGES TO DOCUMENT:
  111. %    \index \glossary \typeout \label \tableentry \stop \protect
  112. %
  113. % PARAMETERS:
  114. %
  115. % \columnsep         \skip\footin        \intextsep
  116. % \columnseprule                         \oddsidemargin
  117. % \columnwidth                           \textfloatsep
  118. % \evensidemargin    \footsep            \textheight
  119. % \floatsep          \headheight         \textwidth
  120. % \headsep            \topmargin
  121.  
  122.  
  123. %   ALPHABETIZED LIST:
  124. %
  125. % ORDINARY COMMANDS:
  126. %
  127. % \Alph                \include             \parbox
  128. % \Roman               \index               \put
  129. % \\                   \item                \raisebox
  130. % \alph                \label               \ref
  131. % \appendix            \line                \roman
  132. % \arabic              \linebreak           \rule
  133. % \bibliography        \listoffigures       \section
  134. % \chapter             \listoftables        \shortstack
  135. % \circle              \makebox             \stop
  136. % \cite                \mbox                \subsection
  137. % \cite                \multicolumn         \subsubsection
  138. % \cleardoublepage     \multiput            \tableentry
  139. % \clearpage                                \tableofcontents
  140. % \dashbox             \newline             \today
  141. % \fbox                \newpage             \typein
  142. % \footnotemark        \noindent            \typeout
  143. % \footnotetext        \nolinebreak         \usebox
  144. % \framebox            \nopagebreak         \vector
  145. % \glossary            \oval                \vline
  146. % \hline               \pagebreak           \vspace
  147. % \hspace              \pageref             \protect
  148. %
  149. %
  150. % ENVIRONMENTS & DECLARATIONS:
  151. %
  152. % For each of these commands, the same command name prefixed by 'end'
  153. % is also reserved--e.g., \enddocument.
  154. %
  155. % \BIG               \footnotesize       \pagestyle
  156. % \Big               \head               \picture
  157. % \addtocounter      \includeonly        \raggedright
  158. % \addtolength       \itemize            \restorecr
  159. % \array             \list               \savebox
  160. % \big               \makeglossary       \sbox
  161. % \center            \makeindex          \scriptscriptsize
  162. % \description       \math               \scriptsize
  163. % \displaymath       \minipage           \setcounter
  164. % \document          \newcommand         \setlength
  165. % \documentstyle     \newlength          \settowidth
  166. % \enumerate         \newtheorem         \small
  167. % \equation          \nofiles            \shortstack\tabbing
  168. %                    \normalsize             \tabular
  169. % \float             \obeycr             \thicklines
  170. % \flushleft         \pagelayout         \thinlines
  171. % \flushright        \pagenumbering      \thispagestyle
  172. %                                        \verb, \verbatim
  173. %
  174. % PARAMETERS :
  175. %
  176. % \columnsep         \footinsertskip     \intextsep
  177. % \columnseprule                         \oddsidemargin
  178. % \columnwidth                           \textfloatsep
  179. % \evensidemargin    \footsep            \textheight
  180. % \floatsep          \headheight         \textwidth
  181. % \headsep            \topmargin
  182. %
  183. %
  184. % TABBING COMMANDS:
  185. %
  186. % These commannds are defined only within a tabbing environment.
  187. %
  188. % \kill      \>    \-
  189. % \pushtab   \<    \=
  190. % \poptab    \+
  191.  
  192.  
  193. % COMPLETE LIST :
  194. % Below is a complete list of every command starting with `\' that
  195. % appears in LATEX.TEX.
  196.  
  197. % \
  198. % \!
  199. % \#
  200. % \$
  201. % \&
  202. % \'
  203. % \(
  204. % \)
  205. % \+
  206. % \,
  207. % \-
  208. % \.
  209. % \:
  210. % \;
  211. % \<
  212. % \=
  213. % \>
  214. % \@
  215. % \@@
  216. % \@@end
  217. % \@@endpbox
  218. % \@@eqncr
  219. % \@@hyph
  220. % \@@input
  221. % \@@par
  222. % \@@sqrt
  223. % \@@startpbox
  224. % \@@underline
  225. % \@acci
  226. % \@accii
  227. % \@acciii
  228. % \@acol
  229. % \@acolampacol
  230. % \@addamp
  231. % \@addfield
  232. % \@addmarginpar
  233. % \@addtobot
  234. % \@addtocurcol
  235. % \@addtodblcol
  236. % \@addtonextcol
  237. % \@addtopreamble
  238. % \@addtoreset
  239. % \@addtotoporbot
  240. % \@afterheading
  241. % \@afterindentfalse
  242. % \@afterindenttrue
  243. % \@Alph
  244. % \@alph
  245. % \@ampacol
  246. % \@arabic
  247. % \@argarraycr
  248. % \@argdef
  249. % \@argrsbox
  250. % \@argtabularcr
  251. % \@array
  252. % \@arrayacol
  253. % \@arrayclassiv
  254. % \@arrayclassv
  255. % \@arrayclassz
  256. % \@arraycr
  257. % \@arrayparboxrestore
  258. % \@arrayrule
  259. % \@arstrut
  260. % \@arstrutbox
  261. % \@auxout
  262. % \@badcrerr
  263. % \@badend
  264. % \@badlinearg
  265. % \@badmath
  266. % \@badpoptabs
  267. % \@badtab
  268. % \@beginparpenalty
  269. % \@begintheorem
  270. % \@bibitem
  271. % \@biblabel
  272. % \@bitor
  273. % \@botlist
  274. % \@botnum
  275. % \@botroom
  276. % \@bsphack
  277. % \@caption
  278. % \@captype
  279. % \@car
  280. % \@carcube
  281. % \@cclv
  282. % \@cdr
  283. % \@centercr
  284. % \@centering
  285. % \@cfla
  286. % \@cflb
  287. % \@charlb
  288. % \@charrb
  289. % \@chclass
  290. % \@checkend
  291. % \@chnum
  292. % \@circ
  293. % \@circle
  294. % \@circlefnt
  295. % \@cite
  296. % \@citea
  297. % \@citeb
  298. % \@citex
  299. % \@cla         % counter used in \cline
  300. % \@classi
  301. % \@classii
  302. % \@classiii
  303. % \@classiv
  304. % \@classv
  305. % \@classz
  306. % \@clb         % counter used in \cline
  307. % \@cline
  308. % \@clnht
  309. % \@clnwd
  310. % \@clubpenalty
  311. % \@colht
  312. % \@colnum
  313. % \@colroom
  314. % \@combinedblfloats
  315. % \@combinefloats
  316. % \@comdblflelt
  317. % \@comflelt
  318. % \@cons
  319. % \@contfield
  320. % \@ctrerr
  321. % \@curfield
  322. % \@curline
  323. % \@currbox
  324. % \@currentlabel
  325. % \@currentreference
  326. % \@currenvir
  327. % \@currlist
  328. % \@currtype
  329. % \@curtab
  330. % \@curtabmar
  331. % \@dascnt
  332. % \@dashbox
  333. % \@dashcnt
  334. % \@dashdim
  335. % \@dblarg
  336. % \@dbldeferlist
  337. % \@dblfloat
  338. % \@dblfloatplacement
  339. % \@dblfloatsep
  340. % \@dblfpbot
  341. % \@dblfpsep
  342. % \@dblfptop
  343. % \@dblmaxsep
  344. % \@dbltextfloatsep
  345. % \@dbltoplist
  346. % \@dbltopnum
  347. % \@dbltoproom
  348. % \@deferlist
  349. % \@definecounter
  350. % \@defpar
  351. % \@depth
  352. % \@dischyph
  353. % \@doclearpage
  354. % \@documentstyle
  355. % \@doendpe
  356. % \@donoparitem
  357. % \@dot
  358. % \@dotsep
  359. % \@dottedtocline
  360. % \@downline
  361. % \@downvector
  362. % \@eha
  363. % \@ehb
  364. % \@ehc
  365. % \@ehd
  366. % \@elt
  367. % \@empty
  368. % \@endparenv
  369. % \@endparpenalty
  370. % \@endpbox
  371. % \@endpefalse
  372. % \@endpetrue
  373. % \@endtabbing
  374. % \@endtheorem
  375. % \@enumctr
  376. % \@enumdepth
  377. % \@enumspacing
  378. % \@eqncr
  379. % \@eqnnum
  380. % \@eqnsel
  381. % \@eqnswtrue
  382. % \@esphack
  383. % \@evenfoot
  384. % \@evenhead
  385. % \@expast
  386. % \@failedlist
  387. % \@fcolmadefalse
  388. % \@filesw
  389. % \@fileswfalse
  390. % \@fileswtrue
  391. % \@firstampfalse
  392. % \@firstamptrue
  393. % \@firstcolumntrue
  394. % \@firsttab
  395. % \@flfail
  396. % \@float
  397. % \@floatpenalty
  398. % \@floatplacement
  399. % \@floatsep
  400. % \@flsucceed
  401. % \@fltovf
  402. % \@flushglue
  403. % \@fnsymbol
  404. % \@footnotemark
  405. % \@footnotetext
  406. % \@for
  407. % \@forloop
  408. % \@fornoop
  409. % \@fpbot
  410. % \@fpmin
  411. % \@fpsep
  412. % \@fptop
  413. % \@framebox
  414. % \@framepicbox
  415. % \@freelist
  416. % \@getcirc
  417. % \@getlarrow
  418. % \@getlinechar
  419. % \@getpen
  420. % \@getrarrow
  421. % \@glossaryfile
  422. % \@gobble
  423. % \@gobblecr
  424. % \@gobbletwo
  425. % \@gtempa
  426. % \@halfwidth
  427. % \@halignto
  428. % \@hangfrom
  429. % \@height
  430. % \@highpenalty
  431. % \@hightab
  432. % \@hline
  433. % \@holdpg
  434. % \@hspace
  435. % \@hspacer
  436. % \@hvector
  437. % \@icentercr
  438. % \@iden
  439. % \@ifatmargin
  440. % \@ifdefinable
  441. % \@ifnch
  442. % \@ifnextchar
  443. % \@iforloop
  444. % \@iframebox
  445. % \@iframepicbox
  446. % \@ifstar
  447. % \@ifundefined
  448. % \@iinput           % used in \input
  449. % \@iirsbox
  450. % \@imakebox
  451. % \@imakepicbox
  452. % \@iminipage
  453. % \@index
  454. % \@indexfile
  455. % \@inlabelfalse
  456. % \@input
  457. % \@insertfalse
  458. % \@inserttrue
  459. % \@iparbox
  460. % \@irsbox
  461. % \@isavebox
  462. % \@isavepicbox
  463. % \@ishortstack
  464. % \@istackcr
  465. % \@itabcr
  466. % \@item
  467. % \@itemdepth
  468. % \@itemfudge
  469. % \@itemitem
  470. % \@itemlabel
  471. % \@itempenalty
  472. % \@itemspacing
  473. % \@iwhiledim
  474. % \@iwhilenum
  475. % \@iwhilesw
  476. % \@ixstackcr
  477. % \@killglue
  478. % \@labels
  479. % \@lastchclass
  480. % \@latexbug
  481. % \@latexerr
  482. % \@lbibitem
  483. % \@leftcolumn
  484. % \@leftmarginskip
  485. % \@leftmark
  486. % \@lhead
  487. % \@linechar
  488. % \@linefnt
  489. % \@linelen
  490. % \@list
  491. % \@listctr
  492. % \@listdepth
  493. % \@listi
  494. % \@listii
  495. % \@listvi
  496. % \@lnbk
  497. % \@lowpenalty
  498. % \@lquote
  499. % \@ltab
  500. % \@M
  501. % \@m
  502. % \@mainaux
  503. % \@mainout
  504. % \@makebox
  505. % \@makecaption
  506. % \@makecol
  507. % \@makefcolumn
  508. % \@makefnmark
  509. % \@makefntext
  510. % \@makeonecolumn
  511. % \@makeother
  512. % \@makepicbox
  513. % \@maketwocolumn
  514. % \@marbox
  515. % \@markright
  516. % \@maxdepth
  517. % \@maxsep
  518. % \@maxtab
  519. % \@medpenalty
  520. % \@Mi
  521. % \@midlist
  522. % \@Mii
  523. % \@Miii
  524. % \@minipagefalse
  525. % \@minipagerestore
  526. % \@Miv
  527. % \@mkboth
  528. % \@mklab
  529. % \@mkpream
  530. % \@MM
  531. % \@mparbottom
  532. % \@mparswitchfalse
  533. % \@mpfn
  534. % \@mpfnnumber
  535. % \@mpfootins
  536. % \@mpfootnotetext
  537. % \@mplistdepth
  538. % \@multicnt
  539. % \@namedef
  540. % \@nameuse
  541. % \@nbitem
  542. % \@ne
  543. % \@negargfalse
  544. % \@negargtrue
  545. % \@newctr
  546. % \@newenv
  547. % \@newline
  548. % \@newlist
  549. % \@newlistfalse
  550. % \@next
  551. % \@nextchar
  552. % \@nextwhile
  553. % \@nil
  554. % \@nmbrlistfalse
  555. % \@nmbrlisttrue
  556. % \@nnil
  557. % \@nobreakfalse
  558. % \@nocnterr
  559. % \@nodocument
  560. % \@nofonterror
  561. % \@noitemargfalse
  562. % \@noitemargtrue
  563. % \@noitemerr
  564. % \@noligs
  565. % \@nolnbk
  566. % \@nolnerr
  567. % \@noparitemfalse
  568. % \@noparitemtrue
  569. % \@noparlistfalse
  570. % \@noparlisttrue
  571. % \@nopgbk
  572. % \@normalcr
  573. % \@normalsize
  574. % \@noskipsecfalse
  575. % \@notdefinable
  576. % \@notprerr
  577. % \@nthm
  578. % \@nxttabmar
  579. % \@oddfoot
  580. % \@oddhead
  581. % \@opargbegintheorem
  582. % \@opcol
  583. % \@optionfiles
  584. % \@optionlist
  585. % \@options
  586. % \@othm
  587. % \@outerparskip
  588. % \@outputbox
  589. % \@outputdblcol
  590. % \@outputpage
  591. % \@oval
  592. % \@ovbtrue
  593. % \@ovdx
  594. % \@ovdy
  595. % \@ovhorz
  596. % \@ovltrue
  597. % \@ovri
  598. % \@ovro
  599. % \@ovrtrue
  600. % \@ovttrue
  601. % \@ovvert
  602. % \@ovxx
  603. % \@ovyy
  604. % \@pagedp
  605. % \@pageht
  606. % \@par
  607. % \@parboxrestore
  608. % \@parmoderr
  609. % \@partaux
  610. % \@partlist
  611. % \@partout
  612. % \@partsw
  613. % \@partswfalse
  614. % \@partswtrue
  615. % \@pboxswfalse
  616. % \@pboxswtrue
  617. % \@pgbk
  618. % \@picbox
  619. % \@picht
  620. % \@picture
  621. % \@pnumwidth
  622. % \@preamble
  623. % \@preamblecmds
  624. % \@preamerr
  625. % \@put
  626. % \@qend
  627. % \@qrelax
  628. % \@reargdef
  629. % \@renewenv
  630. % \@restorepar
  631. % \@reversemarginfalse
  632. % \@reversemargintrue
  633. % \@rhead
  634. % \@rightmark
  635. % \@rightskip
  636. % \@Roman
  637. % \@roman
  638. % \@rsbox
  639. % \@rtab
  640. % \@rule
  641. % \@sanitize
  642. % \@savebox
  643. % \@savemarbox
  644. % \@savepicbox
  645. % \@savsf
  646. % \@savsk
  647. % \@scolelt
  648. % \@sdblcolelt
  649. % \@secpenalty
  650. % \@sect
  651. % \@setpar
  652. % \@settab
  653. % \@sharp
  654. % \@shortstack
  655. % \@sline
  656. % \@spaces
  657. % \@specialoutput
  658. % \@specialpagefalse
  659. % \@specialstyle
  660. % \@sptoken
  661. % \@sqrt
  662. % \@ssect
  663. % \@startcolumn
  664. % \@startdblcolumn
  665. % \@startfield
  666. % \@startline
  667. % \@startpbox
  668. % \@startsection
  669. % \@starttoc
  670. % \@stopfield
  671. % \@stopline
  672. % \@stpelt
  673. % \@svector
  674. % \@sverb
  675. % \@svsec
  676. % \@svsechd
  677. % \@tabacol
  678. % \@tabarray
  679. % \@tabclassiv
  680. % \@tabclassz
  681. % \@tabcr
  682. % \@tablab
  683. % \@tabminus
  684. % \@tabplus
  685. % \@tabpush
  686. % \@tabrj
  687. % \@tabular
  688. % \@tabularcr
  689. % \@temp
  690. % \@tempa
  691. % \@tempb
  692. % \@tempbox
  693. % \@tempboxa
  694. % \@tempc
  695. % \@tempcnta
  696. % \@tempcntb
  697. % \@tempd
  698. % \@tempdima
  699. % \@tempdimb
  700. % \@tempe
  701. % \@tempskipa
  702. % \@tempskipb
  703. % \@tempswa
  704. % \@tempswafalse
  705. % \@tempswatrue
  706. % \@temptokena
  707. % \@testdef
  708. % \@testfp
  709. % \@testpach
  710. % \@textbottom
  711. % \@textfloatsep
  712. % \@textmin
  713. % \@texttop
  714. % \@tfor
  715. % \@tforloop
  716. % \@thanks
  717. % \@thefnmark
  718. % \@thefoot
  719. % \@thehead
  720. % \@themargin
  721. % \@themark
  722. % \@thm
  723. % \@thmcounter
  724. % \@thmcountersep
  725. % \@tocrmarg
  726. % \@toodeep
  727. % \@toplist
  728. % \@topnewpage
  729. % \@topnum
  730. % \@toproom
  731. % \@topsep
  732. % \@topsepadd
  733. % \@totalleftmargin
  734. % \@trivlist
  735. % \@tryfcolumn
  736. % \@trylist
  737. % \@twocolumnfalse
  738. % \@twoside
  739. % \@twosidefalse
  740. % \@typein
  741. % \@upline
  742. % \@upordown
  743. % \@upvector
  744. % \@verb
  745. % \@verbatim
  746. % \@vline
  747. % \@vobeyspaces
  748. % \@vspace
  749. % \@vspacer
  750. % \@vtryfc
  751. % \@vvector
  752. % \@warning
  753. % \@wckptelt
  754. % \@whiledim
  755. % \@whilenoop
  756. % \@whilenum
  757. % \@whilesw
  758. % \@whileswnoop
  759. % \@wholewidth
  760. % \@width
  761. % \@wrindex
  762. % \@writeckpt
  763. % \@writefile
  764. % \@wtryfc
  765. % \@x@sf
  766. % \@xarg
  767. % \@xargarraycr
  768. % \@xarraycr
  769. % \@xbitor
  770. % \@xcentercr
  771. % \@xdblarg
  772. % \@xdblfloat
  773. % \@xdim
  774. % \@xeqncr
  775. % \@xexnoop
  776. % \@xexpast
  777. % \@xfloat
  778. % \@xfootnote
  779. % \@xfootnotemark
  780. % \@xfootnotenext
  781. % \@xhead
  782. % \@xifnch
  783. % \@xmpar
  784. % \@xnewline
  785. % \@xnthm
  786. % \@xobeysp
  787. % \@xsect
  788. % \@xstartcol
  789. % \@xtabcr
  790. % \@xtabularcr
  791. % \@xthm
  792. % \@xtryfc
  793. % \@xtypein
  794. % \@xverbatim
  795. % \@xxxii
  796. % \@xympar
  797. % \@yarg
  798. % \@yargarraycr
  799. % \@ydim
  800. % \@yeqncr
  801. % \@yhead
  802. % \@ympar
  803. % \@ynthm
  804. % \@ythm
  805. % \@ytryfc
  806. % \@yyarg
  807. % \@ztryfc
  808. % \a
  809. % \active
  810. % \addcontentsline
  811. % \addpenalty
  812. % \addtocontents
  813. % \addtocounter
  814. % \addtolength
  815. % \addvspace
  816. % \advance
  817. % \alloc@
  818. % \allocationnumber
  819. % \Alph
  820. % \alph
  821. % \and
  822. % \appendix
  823. % \arabic
  824. % \array
  825. % \arraycolsep
  826. % \arrayrulewidth
  827. % \arraystretch
  828. % \author
  829. % \bar
  830. % \baselineskip
  831. % \begin
  832. % \begingroup
  833. % \bf
  834. % \bgroup
  835. % \bibcite
  836. % \bibdata
  837. % \bibitem
  838. % \bibliography
  839. % \bibliographystyle
  840. % \bibstyle
  841. % \BIG
  842. % \Big
  843. % \big
  844. % \bigskip
  845. % \botfigrule
  846. % \botmark
  847. % \botnum
  848. % \bottomfraction
  849. % \box
  850. % \boxmaxdepth
  851. % \buildrel
  852. % \bullet
  853. % \c@bottomnumber
  854. % \c@chapter
  855. % \c@dbltopnumber
  856. % \c@equation
  857. % \c@eval
  858. % \c@footnote
  859. % \c@mpfootnote
  860. % \c@page
  861. % \c@secnumdepth
  862. % \c@section
  863. % \c@tocdepth
  864. % \c@topnumber
  865. % \c@totalnumber
  866. % \caption
  867. % \catcode
  868. % \catcoded
  869. % \center
  870. % \centering
  871. % \chapter
  872. % \chaptermark
  873. % \char
  874. % \chardef
  875. % \circle
  876. % \cite
  877. % \cl@@ckpt
  878. % \cleardoublepage
  879. % \clearpage
  880. % \cline
  881. % \closeout
  882. % \clubpenalty
  883. % \columnsep
  884. % \columnseprule
  885. % \columnwidth
  886. % \contentsline
  887. % \copy
  888. % \count
  889. % \countdef
  890. % \cr
  891. % \crcr
  892. % \csname
  893. % \dag
  894. % \dagger
  895. % \dashbox
  896. % \date
  897. % \dblfigrule
  898. % \dblfloatpagefraction
  899. % \dblfloatsep
  900. % \dbltexfloatsep
  901. % \dbltextfloatsep
  902. % \dbltopfraction
  903. % \ddagger
  904. % \deadcycles
  905. % \def
  906. % \description
  907. % \dimen
  908. % \dimen@
  909. % \discretionary
  910. % \displaymath
  911. % \displaystyle
  912. % \displaywidth
  913. % \divide
  914. % \do
  915. % \document
  916. % \documentstyle
  917. % \dospecials
  918. % \doublerulesep
  919. % \dp
  920. % \edef
  921. % \egroup
  922. % \else
  923. % \end
  924. % \end@dblfloat
  925. % \end@float
  926. % \endarray
  927. % \endcsname
  928. % \enddocument
  929. % \endenumerate
  930. % \endequation
  931. % \endfigure
  932. % \endgroup
  933. % \enditemize
  934. % \endlist
  935. % \endpicture
  936. % \endsloppypar
  937. % \endtabbing
  938. % \endtabular
  939. % \endthebibliography
  940. % \endtrivlist
  941. % \enumerate
  942. % \eqnarray
  943. % \eqno
  944. % \equation
  945. % \errmessage
  946. % \errorstopmode
  947. % \eval
  948. % \evensidemargin
  949. % \everyjob
  950. % \everypar
  951. % \expandafter
  952. % \extracolsep
  953. % \fbox
  954. % \fboxrule
  955. % \fboxsep
  956. % \fi
  957. % \figure
  958. % \fill
  959. % \firstmark
  960. % \float
  961. % \floatingpenalty
  962. % \floatpagefraction
  963. % \floatsep
  964. % \flushbottom
  965. % \flushleft
  966. % \flushright
  967. % \fnsymbol
  968. % \footins
  969. % \footinsertskip
  970. % \footnote
  971. % \footnotemark
  972. % \footnoterule
  973. % \footnotesep
  974. % \footnotesize
  975. % \footnotetext
  976. % \footsep
  977. % \footskip
  978. % \frac
  979. % \frame
  980. % \framebox
  981. % \framerule
  982. % \framesep
  983. % \frenchspacing
  984. % \fussy
  985. % \futurelet
  986. % \gdef
  987. % \global
  988. % \glossary
  989. % \halfwidth
  990. % \halign
  991. % \hangindent
  992. % \hbox
  993. % \head
  994. % \headheight
  995. % \headsep
  996. % \hfil
  997. % \hfill
  998. % \hfuzz
  999. % \hline
  1000. % \hrule
  1001. % \hsize
  1002. % \hskip
  1003. % \hspace
  1004. % \hss
  1005. % \ht
  1006. % \Huge
  1007. % \huge
  1008. % \hyphenchar
  1009. % \if
  1010. % \if@afterindent
  1011. % \if@eqnsw
  1012. % \if@endpe
  1013. % \if@fcolmade
  1014. % \if@filesw
  1015. % \if@firstamp
  1016. % \if@firstcolumn
  1017. % \if@ignore
  1018. % \if@inlabel
  1019. % \if@insert
  1020. % \if@minipage
  1021. % \if@mparswitch
  1022. % \if@negarg
  1023. % \if@newlist
  1024. % \if@nmbrlist
  1025. % \if@nobreak
  1026. % \if@noitemarg
  1027. % \if@noparitem
  1028. % \if@noparlist
  1029. % \if@noskipsec
  1030. % \if@ovb
  1031. % \if@ovl
  1032. % \if@ovr
  1033. % \if@ovt
  1034. % \if@pboxsw
  1035. % \if@reversemargin
  1036. % \if@rjfield
  1037. % \if@specialpage
  1038. % \if@tempswa
  1039. % \if@test
  1040. % \if@twocolumn
  1041. % \if@twoside
  1042. % \ifcase
  1043. % \ifdim
  1044. % \ifeof
  1045. % \ifhmode
  1046. % \ifinner
  1047. % \ifmmode
  1048. % \ifnum
  1049. % \ifodd
  1050. % \ifvmode
  1051. % \ifvoid
  1052. % \ifx
  1053. % \ignorespaces
  1054. % \immediate
  1055. % \include
  1056. % \includeonly
  1057. % \indent
  1058. % \index
  1059. % \indexentry
  1060. % \input
  1061. % \insc@unt
  1062. % \insert
  1063. % \interdisplaylinepenalty
  1064. % \interfootnotelinepenalty
  1065. % \interlinepenalty
  1066. % \intextsep
  1067. % \it
  1068. % \item
  1069. % \itemindent
  1070. % \itemize
  1071. % \itemsep
  1072. % \jobname
  1073. % \kern
  1074. % \kill
  1075. % \label
  1076. % \labelenumi
  1077. % \labelenumiv
  1078. % \labelitemi
  1079. % \labelitemii
  1080. % \labelitemiii
  1081. % \labelitemiv
  1082. % \labelsep
  1083. % \labelwidth
  1084. % \LARGE
  1085. % \Large
  1086. % \large
  1087. % \lastbox
  1088. % \lastskip
  1089. % \LaTeX
  1090. % \lbrace
  1091. % \leaders
  1092. % \leavevmode
  1093. % \lefteqn
  1094. % \leftmargin
  1095. % \leftmargini
  1096. % \leftmarginvi
  1097. % \leftmark
  1098. % \leftskip
  1099. % \let
  1100. % \limits
  1101. % \line
  1102. % \linebreak
  1103. % \lineskip
  1104. % \linethickness
  1105. % \linewidth
  1106. % \list
  1107. % \listoffigures
  1108. % \listoftables
  1109. % \listparindent
  1110. % \llap
  1111. % \long
  1112. % \lower
  1113. % \m@ne
  1114. % \m@th
  1115. % \makeatletter
  1116. % \makeatother
  1117. % \makebox
  1118. % \makeglossary
  1119. % \makeindex
  1120. % \makelabel
  1121. % \maketitle
  1122. % \marginpar
  1123. % \marginparpush
  1124. % \marginparsep
  1125. % \marginparwidth
  1126. % \mark
  1127. % \markboth
  1128. % \markright
  1129. % \math
  1130. % \mathchar
  1131. % \mathchardef
  1132. % \mathop
  1133. % \mathrel
  1134. % \maxdeadcycles
  1135. % \maxdepth
  1136. % \maxdimen
  1137. % \mb@b
  1138. % \mb@eval
  1139. % \mb@l
  1140. % \mb@r
  1141. % \mb@t
  1142. % \mbox
  1143. % \medskip
  1144. % \message
  1145. % \minipage
  1146. % \mit
  1147. % \mkern
  1148. % \moveright
  1149. % \mskip
  1150. % \multicolumn
  1151. % \multiply
  1152. % \multiput
  1153. % \multispan
  1154. % \newbox
  1155. % \newcommand
  1156. % \newcount
  1157. % \newcounter
  1158. % \newdimen
  1159. % \newenvironment
  1160. % \newif
  1161. % \newinsert
  1162. % \newlabel
  1163. % \newlength
  1164. % \newline
  1165. % \newlinechar
  1166. % \newpage
  1167. % \newsavebox
  1168. % \newskip
  1169. % \newswitch
  1170. % \newtheorem
  1171. % \newtoks
  1172. % \newwrite
  1173. % \noalign
  1174. % \nobreak
  1175. % \nocite
  1176. % \noexpand
  1177. % \nofiles
  1178. % \noindent
  1179. % \nointerlineskip
  1180. % \nolinebreak
  1181. % \nonumber
  1182. % \nopagebreak
  1183. % \normalbaselineskip
  1184. % \normallineskip
  1185. % \normalmarginpar
  1186. % \normalsize
  1187. % \nullfont
  1188. % \number
  1189. % \numberline
  1190. % \obeycr
  1191. % \obeylines
  1192. % \obeyspaces
  1193. % \oddsidemargin
  1194. % \of
  1195. % \onecolumn
  1196. % \openin
  1197. % \or
  1198. % \outer
  1199. % \output
  1200. % \outputpenalty
  1201. % \oval
  1202. % \over
  1203. % \overfullrule
  1204. % \overline
  1205. % \p@
  1206. % \pagebreak
  1207. % \pagelayout
  1208. % \pagenumbering
  1209. % \pageref
  1210. % \pagestyle
  1211. % \par
  1212. % \paragraph
  1213. % \parbox
  1214. % \parfillskip
  1215. % \parindent
  1216. % \parsep
  1217. % \parshape
  1218. % \parskip
  1219. % \partopsep
  1220. % \partsw
  1221. % \penalty
  1222. % \picture
  1223. % \poptab
  1224. % \poptabs
  1225. % \postdisplaypenalty
  1226. % \prevdepth
  1227. % \protect
  1228. % \ps@empty
  1229. % \ps@plain
  1230. % \pushtab
  1231. % \pushtabs
  1232. % \put
  1233. % \quotation
  1234. % \raggedbottom
  1235. % \raggedleft
  1236. % \raggedright
  1237. % \raise
  1238. % \raisebox
  1239. % \rbrace
  1240. % \read
  1241. % \ref
  1242. % \refstepcounter
  1243. % \relax
  1244. % \renewcommand
  1245. % \renewenvironment
  1246. % \restorecr
  1247. % \reversemarginpar
  1248. % \right
  1249. % \rightmargin
  1250. % \rightmark
  1251. % \rightskip
  1252. % \rlap
  1253. % \rm
  1254. % \Roman
  1255. % \roman
  1256. % \romannumeral
  1257. % \root
  1258. % \rule
  1259. % \samepage
  1260. % \savebox
  1261. % \sbox
  1262. % \sc
  1263. % \scriptscriptsize
  1264. % \scriptsize
  1265. % \secdef
  1266. % \section
  1267. % \sectionmark
  1268. % \setbox
  1269. % \setcounter
  1270. % \setlength
  1271. % \settowidth
  1272. % \shipout
  1273. % \shortstack
  1274. % \showboxbreadth
  1275. % \showboxdepth
  1276. % \sixt@@n
  1277. % \skip
  1278. % \sl
  1279. % \sloppy
  1280. % \sloppypar
  1281. % \small
  1282. % \smallskip
  1283. % \space
  1284. % \spacefactor
  1285. % \splitmaxdepth
  1286. % \splittopskip
  1287. % \sqrt
  1288. % \ss
  1289. % \stackrel
  1290. % \stepcounter
  1291. % \stop
  1292. % \stretch
  1293. % \string
  1294. % \strut
  1295. % \subsection
  1296. % \subsubsection
  1297. % \tabalign
  1298. % \tabbing
  1299. % \tabbingsep
  1300. % \tabcolsep
  1301. % \tableentry
  1302. % \tableofcontents
  1303. % \tabskip
  1304. % \tabular
  1305. % \tencirc
  1306. % \tencircw
  1307. % \tenln
  1308. % \tenlnw
  1309. % \textfloatsep
  1310. % \textfraction
  1311. % \textheight
  1312. % \textwidth
  1313. % \thanks
  1314. % \the
  1315. % \thebibliography
  1316. % \theenumi
  1317. % \theenumii
  1318. % \theequation
  1319. % \thefigure
  1320. % \thefootnote
  1321. % \thempfn
  1322. % \thempfootnote
  1323. % \thepage
  1324. % \thesection
  1325. % \thicklines
  1326. % \thinlines
  1327. % \thinspace
  1328. % \thispagestyle
  1329. % \tiny
  1330. % \title
  1331. % \today
  1332. % \tolerance
  1333. % \topfigrule
  1334. % \topfraction
  1335. % \topmargin
  1336. % \topnewpage
  1337. % \topnum
  1338. % \topsep
  1339. % \topskip
  1340. % \tracingonline
  1341. % \tracingoutput
  1342. % \tracingstats
  1343. % \trivlist
  1344. % \tt
  1345. % \tw@
  1346. % \twocolumn
  1347. % \typein
  1348. % \typeout
  1349. % \unbox
  1350. % \underline
  1351. % \unhbox
  1352. % \unitlength
  1353. % \unskip
  1354. % \unvbox
  1355. % \usebox
  1356. % \usecounter
  1357. % \vadjust
  1358. % \value
  1359. % \vbox
  1360. % \vcenter
  1361. % \vector
  1362. % \verb
  1363. % \verbatim
  1364. % \vfil
  1365. % \vfuzz
  1366. % \vline
  1367. % \vrule
  1368. % \vsize
  1369. % \vskip
  1370. % \vspace
  1371. % \vsplit
  1372. % \vss
  1373. % \vtop
  1374. % \wd
  1375. % \write
  1376. % \writes
  1377. % \xdef
  1378. % \z@
  1379. % \[
  1380. % \\
  1381. % \]
  1382. % \^
  1383. % \_
  1384. % \`
  1385. % \{
  1386. % \|
  1387. % \}
  1388. % \~
  1389.  
  1390.  
  1391.  
  1392.  
  1393. %      ****************************************
  1394. %      *         GENERAL CONVENTIONS          *
  1395. %      ****************************************
  1396. %
  1397. % THE \LaTeX LOGO IS DEFINED HERE.
  1398. %
  1399. \def\LaTeX{{\rm L\kern-.36em\raise.3ex\hbox{\sc a}\kern-.15em
  1400.     T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
  1401.  
  1402. % SAVED VERSIONS OF TeX PRIMITIVES:
  1403. %
  1404. %  The TeX primitive \foo is saved as \@@foo .  The following primitives
  1405. %  are handled in this way:
  1406.  
  1407. \let\@@par=\par
  1408. %\let\@@relax=\relax  % This was needed at one time, but seems to be obsolete.
  1409. \let\@@input=\input
  1410. \let\@@end=\end
  1411.  
  1412. % The following was added 19 April 1986:
  1413. % The \- command is redefined to allow it to work in the \tt type style,
  1414. % where automatic hyphenation is suppressed by setting \hyphenchar to -1.
  1415. % The original definition is saved as \@@hyph just in case anyone needs it.
  1416.  
  1417. \let\@@hyph=\-        % Original defin
  1418. \def\-{\discretionary{-}{}{}}
  1419.  
  1420. % SAVED VERSIONS OF TeX PARAMETERS
  1421. %
  1422. %  \normalbaselineskip and \normallineskip hold the
  1423. %  normal values of \baselineskip and \lineskip
  1424.  
  1425. % Any font-changing commands that change the normal value of \lineskip
  1426. % and \baselineskip should change their saved values.
  1427.  
  1428. % The following definitions save token space.  E.g., using \@height
  1429. % instead of height saves 5 tokens at the cost in time of one macro
  1430. % expansion.
  1431.  
  1432. \def\@height{height}
  1433. \def\@depth{depth}
  1434. \def\@width{width}
  1435.  
  1436. % The following implements the LaTeX \{ and \} commands.
  1437. % Changed 21 Apr 87 to make them robust.
  1438.  
  1439. \def\{{\protect\@lb}
  1440. \def\@lb{\relax\ifmmode\lbrace\else$\lbrace$\fi}
  1441. \def\}{\protect\@rb}
  1442. \def\@rb{\relax\ifmmode\rbrace\else$\rbrace$\fi}
  1443.  
  1444.  \message{counters,}
  1445. %      ****************************************
  1446. %      *          COUNTERS, ETC.              *
  1447. %      ****************************************
  1448. %
  1449. % THE FOLLOWING ARE FROM PLAIN:
  1450. % \z@         : A zero dimen or number.  It's more efficient to write
  1451. %               \parindent\z@ than \parindent 0pt.
  1452. % \@ne        : The number 1.
  1453. % \m@ne       : The number -1.
  1454. % \tw@        : The number 2.
  1455. % \sixt@@n    : The number 16.
  1456. % \@m         : The number 1000.
  1457. % \@xxxii     : The number 32
  1458. % \@M         : The number 10000.
  1459. % \@Mi        : The number 10001.
  1460. % \@Mii       : The number 10002.
  1461. % \@Miii      : The number 10003.
  1462. % \@Miv       : The number 10004.
  1463. % \@MM        : The number 20000.
  1464. %
  1465. % \@flushglue : Glue used for \right- & \leftskip to = 0pt plus 1fil
  1466.  
  1467. \chardef\@xxxii=32
  1468. \mathchardef\@Mi=10001
  1469. \mathchardef\@Mii=10002
  1470. \mathchardef\@Miii=10003
  1471. \mathchardef\@Miv=10004
  1472.  
  1473. % Redefine PLAIN.TEX macros not to be \outer
  1474.  
  1475. \def\newcount{\alloc@0\count\countdef\insc@unt}
  1476. \def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
  1477. \def\newskip{\alloc@2\skip\skipdef\insc@unt}
  1478. \def\newbox{\alloc@4\box\chardef\insc@unt}
  1479. \def\newwrite{\alloc@7\write\chardef\sixt@@n}
  1480.  
  1481. \newwrite\@unused
  1482. \newcount\@tempcnta
  1483. \newcount\@tempcntb
  1484. \newif\if@tempswa\@tempswatrue
  1485.  
  1486. \newdimen\@tempdima
  1487. \newdimen\@tempdimb
  1488.  
  1489. \newbox\@tempboxa
  1490.  
  1491. \newskip\@flushglue \@flushglue = 0pt plus 1fil
  1492. \newskip\@tempskipa
  1493. \newskip\@tempskipb
  1494. \newtoks\@temptokena
  1495.  
  1496.  \message{hacks,}
  1497. %      ****************************************
  1498. %      *            USEFUL HACKS              *
  1499. %      ****************************************
  1500. %
  1501. %  \@namedef{NAME}   : Expands to \def\NAME , except name can contain any
  1502. %                      characters.
  1503. %  \@nameuse{NAME}   : Expands to \NAME .
  1504. %
  1505. %  \@ifnextchar X{YES}{NO}
  1506. %                    : Expands to YES if next character is an 'X',
  1507. %                      and to NO otherwise. (Uses temps a-c.)
  1508. %                      NOTE: GOBBLES ANY SPACE FOLLOWING IT.
  1509. %
  1510. %  \@ifstar{YES}{NO} : Gobbles following spaces and then tests if next the
  1511. %                      character is a '*'.  If it is, then it gobbles the
  1512. %                      '*' and expands to YES, otherwise it expands to NO.
  1513. %
  1514. %  \@dblarg{CMD}{ARG}  : \@dblarg{CMD}{ARG} expands to CMD[ARG]{ARG}.  Use
  1515. %                        \@dblarg\CS when \CS takes arguments [ARG1]{ARG2},
  1516. %                        where default is ARG1 = ARG2.
  1517. %
  1518. %  \@ifundefined{NAME}{YES}{NO}
  1519. %                    : If \NAME is undefined then it executes YES,
  1520. %                      otherwise it executes NO.  More precisely,
  1521. %                      true if \NAME either undefined or = \relax.
  1522. %  \@ifdefinable \NAME {YES}
  1523. %                    : Executes YES if the user is allowed to define \NAME,
  1524. %                      otherwise it gives an error.  The user can define \NAME
  1525. %                      if \@ifundefined{NAME} is true, 'NAME' /= 'relax'
  1526. %                      and the first three letters of 'NAME' are not
  1527. %                      'end'.
  1528. %  \newcommand{\FOO}[i]{TEXT}
  1529. %                    : User command to define \FOO to be a macro with
  1530. %                      i arguments (i = 0 if missing) having the definition
  1531. %                      TEXT.  Produces an error if \FOO already defined.
  1532. %
  1533. %  \renewcommand{\FOO}[i]{TEXT} : Same as \newcommand, except it
  1534. %                      checks if \FOO already defined.
  1535. %
  1536. %  \newenvironment{FOO}[i]{DEF1}{DEF2}
  1537. %         equivalent to
  1538. %         \newcommand{\FOO}[i]{DEF1} \def{\endFOO}{DEF2}
  1539. %
  1540. %  \renewenvironment : obvious companion to \newenvironment
  1541. %
  1542. %  \@cons : See description of \output routine.
  1543. %
  1544. %  \@car T1 T2 ... Tn\@nil == T1  (unexpanded)
  1545. %
  1546. %  \@cdr T1 T2 ... Tn\@nil == T2 ... Tn     (unexpanded)
  1547. %
  1548. %  \typeout{message} : produces a warning message on the terminal
  1549. %
  1550. %  \@warning{message}: prints 'LaTeX Warning: message.'
  1551. %
  1552. %  \typein{message}  : Types message, asks the user to type in a command, then
  1553. %                      executes it
  1554. %
  1555. %  \typein[\CS]{MSG} : Same as above, except defines \CS to be the input
  1556. %                      instead of executing it.
  1557.  
  1558. \def\typein{\let\@typein\relax\@ifnextchar[{\@xtypein}{\@xtypein[\@typein]}}
  1559. \def\@xtypein[#1]#2{\typeout{#2}\read0 to#1\ifx #1\@defpar \def#1{}\else
  1560.    \@iden{\expandafter\@strip\expandafter
  1561.    #1#1\@gobble\@gobble} \@gobble\fi\@typein}
  1562. \def\@strip#1#2 \@gobble{\def #1{#2}}
  1563. \def\@defpar{\par}
  1564. \def\@iden#1{#1}
  1565.  
  1566. \def\typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}
  1567. \def\@warning#1{\typeout{LaTeX Warning: #1.}}
  1568. \def\@namedef#1{\expandafter\def\csname #1\endcsname}
  1569. \def\@nameuse#1{\csname #1\endcsname}
  1570.  
  1571. \def\@cons#1#2{\begingroup\let\@elt\relax\xdef#1{#1\@elt #2}\endgroup}
  1572.  
  1573. \def\@car#1#2\@nil{#1}
  1574. \def\@cdr#1#2\@nil{#2}
  1575.  
  1576. % \@carcube T1 ... Tn\@nil = T1 T2 T3 , n > 3
  1577. \def\@carcube#1#2#3#4\@nil{#1#2#3}
  1578.  
  1579. \def\newcommand#1{\@ifnextchar [{\@argdef#1}{\@argdef#1[0]}}
  1580.  
  1581. \def\renewcommand#1{\edef\@tempa{\expandafter\@cdr\string
  1582.   #1\@nil}\@ifundefined{\@tempa}{\@latexerr{\string#1\space undefined}\@ehc
  1583.     }{}\@ifnextchar [{\@reargdef#1}{\@reargdef#1[0]}}
  1584.  
  1585. \def\newenvironment#1{\@ifnextchar
  1586.      [{\@newenv{#1}}{\@newenv{#1}[0]}}
  1587.  
  1588. \long\def\@newenv#1[#2]#3{\expandafter\newcommand
  1589.      \csname #1\endcsname[#2]{#3}\expandafter\long
  1590.      \expandafter\def\csname end#1\endcsname}
  1591.  
  1592. \def\renewenvironment#1{\@ifnextchar
  1593.      [{\@renewenv{#1}}{\@renewenv{#1}[0]}}
  1594.  
  1595. \long\def\@renewenv#1[#2]#3{\expandafter\renewcommand
  1596.      \csname #1\endcsname[#2]{#3}\expandafter\long
  1597.      \expandafter\def\csname end#1\endcsname}
  1598.  
  1599. \long\def\@argdef#1[#2]#3{\@ifdefinable #1{\@reargdef#1[#2]{#3}}}
  1600.  
  1601. % Absolutely untypable control sequence \@?@?  substituted for \@tempb in
  1602. % definition of \@reargdef because it (and therefore \newcommand and
  1603. % \renewcommand) leaves the control sequence dangerously \let to #.
  1604. % (Change made 23 November 87.)
  1605. %
  1606. \catcode`\?=11\relax
  1607. \long\def\@reargdef#1[#2]#3{\@tempcnta#2\relax\let#1\relax
  1608. \edef\@tempa{\long\def#1}\@tempcntb \@ne
  1609. \let\@?@?\relax\@whilenum\@tempcnta>0
  1610. \do{\edef\@tempa{\@tempa\@?@?\the\@tempcntb}\advance\@tempcntb \@ne \advance
  1611. \@tempcnta \m@ne}\let\@?@?##\@tempa{#3}}
  1612. \catcode`\?=12\relax
  1613.  
  1614.  
  1615. % 9 Jan 90 : Missing % added to following definition.
  1616. \long\def\@ifdefinable #1#2{\edef\@tempa{\expandafter\@cdr\string #1\@nil}%
  1617. \@ifundefined{\@tempa}{\edef\@tempb{\expandafter\@carcube \@tempa xxxx\@nil}%
  1618. \ifx \@tempb\@qend \@notdefinable\else
  1619. \ifx \@tempa\@qrelax \@notdefinable\else  #2\fi\fi}{\@notdefinable}}
  1620.  
  1621. \long\def\@ifundefined#1#2#3{\expandafter\ifx\csname
  1622.   #1\endcsname\relax#2\else#3\fi}
  1623.  
  1624.  
  1625. % The following define \@qend and \@qrelax to be the strings 'end' and
  1626. % 'relax' with the characters \catcoded 12.
  1627.  
  1628. \edef\@qend{\expandafter\@cdr\string\end\@nil}
  1629. \edef\@qrelax{\expandafter\@cdr\string\relax\@nil}
  1630.  
  1631. % \@ifnextchar X{YES}{NO}
  1632. %  BEGIN
  1633. %    \@tempe := X  % uses \let
  1634. %    \@tempa := YES
  1635. %    \@tempb := NO
  1636. %    \futurelet\@tempc
  1637. %    \@ifnch
  1638. %  END
  1639. %
  1640. % \@ifnch ==
  1641. %   BEGIN
  1642. %     if  \@tempc = blank space
  1643. %       then  \@tempd := def(\@xifnch)
  1644. %       else  if  \@tempc = \@tempe
  1645. %                then  \@tempd := def(\@tempa)
  1646. %                else  \@tempd := def(\@tempb)
  1647. %             fi
  1648. %     fi
  1649. %     \@tempd
  1650. %   END
  1651. %
  1652. % \@xifnch ==
  1653. %  BEGIN
  1654. %    gobble blanks
  1655. %    \futurelet\@tempc
  1656. %    \@ifnch
  1657. %  END
  1658. %
  1659. \def\@ifnextchar#1#2#3{\let\@tempe #1\def\@tempa{#2}\def\@tempb{#3}\futurelet
  1660.     \@tempc\@ifnch}
  1661. \def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch
  1662.       \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
  1663.       \fi \@tempd}
  1664.  
  1665. % NOTE: the following hacking must precede the definition of \:
  1666. %  as math medium space.
  1667.  
  1668. \def\:{\let\@sptoken= } \:  % this makes \@sptoken a space token
  1669.  
  1670. \def\:{\@xifnch} \expandafter\def\: {\futurelet\@tempc\@ifnch}
  1671.  
  1672. \def\@ifstar#1#2{\@ifnextchar *{\def\@tempa*{#1}\@tempa}{#2}}
  1673.  
  1674. \long\def\@dblarg#1{\@ifnextchar[{#1}{\@xdblarg{#1}}}
  1675. \long\def\@xdblarg#1#2{#1[{#2}]{#2}}
  1676.  
  1677. % The command \@sanitize changes the catcode of all special characters
  1678. % except for braces to 'other'.  It can be used for commands like
  1679. % \index that want to write their arguments verbatim.  Needless to
  1680. % say, this command should only be executed within a group, or chaos
  1681. % will ensue.
  1682.  
  1683. \def\@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&%
  1684. \@makeother\#\@makeother\^\@makeother\^^K\@makeother\_\@makeother\^^A%
  1685. \@makeother\%\@makeother\~}
  1686.  
  1687.  
  1688.  \message{errors,}
  1689. %      ****************************************
  1690. %      *           ERROR HANDLING             *
  1691. %      ****************************************
  1692. %
  1693. %  \@latexerr{MSG}{HLP}: Types a LaTeX error message MSG and gives an error
  1694. %                          halt with error help message HLP.
  1695. %
  1696. \newlinechar`\^^J
  1697.  
  1698. % 19 Jun 86, took out the grouping. re: John Hobby
  1699. \def\@latexerr#1#2{%
  1700. \edef\@tempc{#2}\expandafter\errhelp\expandafter{\@tempc}%
  1701. \typeout{LaTeX error. \space See LaTeX manual for explanation.^^J
  1702.  \space\@spaces\@spaces\@spaces Type \space H <return> \space for
  1703.  immediate help.}\errmessage{#1}}
  1704.  
  1705. \def\@spaces{\space\space\space\space}
  1706.  
  1707. %% error help message pieces.
  1708. \def\@eha{Your command was ignored.
  1709. ^^JType \space I <command> <return> \space to replace it
  1710.   with another command,^^Jor \space <return> \space to continue without it.}
  1711. \def\@ehb{You've lost some text. \space \@ehc}
  1712. \def\@ehc{Try typing \space <return>
  1713.   \space to proceed.^^JIf that doesn't work, type \space X <return> \space to
  1714.   quit.}
  1715. \def\@ehd{You're in trouble here.  \space\@ehc}
  1716.  
  1717. % Here are all the error message-generating commands of LaTeX.
  1718. %
  1719. % \@notdefinable : Error message generated in \@ifdefinable from calls
  1720. %                  by \newcommand, \newlength, \newtheorem specifying an
  1721. %                  already-defined command name.
  1722. %
  1723. % \@nolnerr      : Generated by \newline and \\ when called in vertical mode.
  1724. %
  1725. % '\... undefined' : Generated in \renewcommand.
  1726. %
  1727. % \@nocnterr     : Generated by \setcounter, \addtocounter or \newcounter
  1728. %                  for undefined counter.
  1729. %
  1730. % \@ctrerr       : Called when trying to print the value of a counter
  1731. %                  numbered by letters that's greater than 26.
  1732. %
  1733. % 'Environment --- undefined' : Issued by \begin for undefined environment.
  1734. %
  1735. % \@badend       : Called by \end that doesn't match its \begin.
  1736. %
  1737. % \@badmath      : Called by \[, \], \( or \) when used in wrong mode.
  1738. %
  1739. % \@toodeep      : Called by a list environment nested more than six levels
  1740. %                  deep, or an enumerate or itemize nested more than four
  1741. %                  levels.
  1742. %
  1743. % \@badpoptabs   : Called by \endtabbing when not enough \poptabs have
  1744. %                  occurred, or by \poptabs when too many have occurred.
  1745. %
  1746. % \@badtab : Called by \>, \+ , \- or \< when stepping to an undefined tab.
  1747. %
  1748. % 'tab overflow' : Occurs in \= when maximum number of tabs exceeded.
  1749. %
  1750. % '\< in mid line' : Occurs in \< when it appears in middle of line.
  1751. %
  1752. % \@preamerr : Occurs in array or tabular environment, or in \multicolumn
  1753. %              command, when error in argument detected.
  1754. %
  1755. % \@badlinearg : Occurs in \line and \vector command when a bad slope
  1756. %                argument is encountered.
  1757. %
  1758. % \@parmoderr  : Occurs in a float environment or a \marginpar when
  1759. %                encountered in inner vertical mode.
  1760. %
  1761. % \@fltovf     : Occurs in float environment or \marginpar when there
  1762. %                are no more free boxes for storing floats.
  1763. %
  1764. % \@latexbug   :  Occurs in output routine.  This is bad news.
  1765. %
  1766. % 'Float(s) lost' : In output routine, caused by a float environment or
  1767. %                   \marginpar occurring in inner vertical mode.
  1768. %
  1769. % \@nofonterror   : Typeface not available.  %%% OBSOLETE; DELETED.
  1770. %
  1771. % \@badcrerr      : A \\ used where it shouldn't be in a centering or flushing
  1772. %                   environment.
  1773. %
  1774. % \@noitemerr     : \addvspace or \addpenalty was called when not in vmode.
  1775. %                   Probably caused by a missing \item.
  1776. %
  1777. % \@notprerr      : A command that can be used only in the preamble
  1778. %                   appears after the \begin{document} command.
  1779.  
  1780. \def\@notdefinable{\@latexerr{Command name '\@tempa' already used}\@eha}
  1781.  
  1782. \def\@nolnerr{\@latexerr{There's no line here to end}\@eha}
  1783.  
  1784. \def\@nocnterr{\@latexerr{No such counter}\@eha}
  1785.  
  1786. \def\@ctrerr{\@latexerr{Counter too large}\@ehb}
  1787.  
  1788. \def\@nodocument{\@latexerr{Missing \string\begin{document}}\@ehd}
  1789.  
  1790. \def\@badend#1{\@latexerr{\string\begin{\@currenvir} ended by
  1791.       \string\end{#1}}\@eha}
  1792.  
  1793. \def\@badmath{\@latexerr{Bad math environment delimiter}\@eha}
  1794.  
  1795. \def\@toodeep{\@latexerr{Too deeply nested}\@ehd}
  1796.  
  1797. \def\@badpoptabs{\@latexerr{\string\pushtabs \space and \string\poptabs
  1798.     \space don't match}\@ehd}
  1799.  
  1800. \def\@badtab{\@latexerr{Undefined tab position}\@ehd}
  1801.  
  1802. \def\@preamerr#1{\@latexerr{\ifcase #1 Illegal character\or
  1803.      Missing @-exp\or Missing p-arg\fi\space
  1804.      in array arg}\@ehd}
  1805.  
  1806. \def\@badlinearg{\@latexerr{Bad \string\line\space or \string\vector
  1807.    \space argument}\@ehb}
  1808.  
  1809. \def\@parmoderr{\@latexerr{Not in outer par mode}\@ehb}
  1810.  
  1811. \def\@fltovf{\@latexerr{Too many unprocessed floats}\@ehb}
  1812.  
  1813. \def\@latexbug{\@latexerr{This may be a LaTeX bug}{Call for help}}
  1814.  
  1815. % \def\@nofonterror{\@latexerr{Typeface not available}\@eha}
  1816.  
  1817. \def\@badcrerr {\@latexerr{Bad use of \string\\}\@ehc}
  1818.  
  1819. \def\@noitemerr{\@latexerr{Something's wrong--perhaps a missing
  1820. \string\item}\@ehc}
  1821.  
  1822. \def\@notprerr {\@latexerr{Can be used only in preamble}\@eha}
  1823.  
  1824.  \message{par,}
  1825. %       ****************************************
  1826. %       *          \par AND \everypar          *
  1827. %       ****************************************
  1828. %
  1829. % There are two situations in which \par may be changed:
  1830. %
  1831. %   - Long-term changes, in which the new value is to remain in effect
  1832. %     until the current environment is left.  The environments that
  1833. %     change \par in this way are the following:
  1834. %
  1835. %         * All list environments (itemize, quote, etc.)
  1836. %         * Environments that turn \par into a noop:
  1837. %              tabbing, array and tabular.
  1838. %
  1839. %   - Temporary changes, in which \par is restored to its previous value the
  1840. %     next time it is executed. The following are all such uses.
  1841. %         * \end [when preceded by \@endparenv, which is called by
  1842. %                 \endtrivlist]
  1843. %         * The mechanism for avoiding page breaks and getting the
  1844. %           spacing right after section heads.
  1845. %
  1846. % To permit the proper interaction of these two situations, long-term
  1847. % changes are made by the following command:
  1848. %     \@setpar{VAL}      : To set \par. It \def's \par and \@par to VAL.
  1849. % Short-term changes are made by the usual \def\par commands.
  1850. % The original values are restored after a short-term change
  1851. % by the \@restorepar commands.
  1852. %
  1853. % NOTE: \@@par always is defined to be the original TeX \par.
  1854. %
  1855. % \everypar is changed only for the short term.  Whenever \everypar
  1856. % is set non-null, it should restore itself to null when executed.
  1857. % The following commands change \everypar in this way:
  1858. %         * \item
  1859. %         * \end [when preceded by \@endparenv, which is called by
  1860. %                 \endtrivlist]
  1861. %         * \minipage
  1862. %
  1863. % WARNING: Commands that make short-term changes to \par and \everypar
  1864. % must take account of the possibility that the new commands and the
  1865. % ones that do the restoration may be executed inside a group.  In
  1866. % particular, \everypar is executed inside a group whenever a new paragraph
  1867. % begins with a left brace.  The \everypar command that restores its
  1868. % definition should be local to the current group (in case the command
  1869. % is inside a minipage used inside someplace where \everypar has been
  1870. % redefined).  Thus, if \everypar is redefined to do an \everypar{}
  1871. % it could take several executions of \everypar before
  1872. % the restoration 'holds'.  This usually causes no problem.  However, to
  1873. % prevent the extra executions from doing harm, use a global switch
  1874. % to keep anything harmful in the new \everypar from being done twice.
  1875. %
  1876. % WARNING: Commands that change \everypar should remember that \everypar
  1877. % might be supposed to set the following switches false:
  1878. %              @nobreak
  1879. %              @minipage
  1880. % they should do the setting if necessary.
  1881.  
  1882. \def\@par{\let\par=\@@par\par}
  1883.  
  1884. \def\@setpar#1{\def\par{#1}\def\@par{#1}}
  1885. \def\@restorepar{\def\par{\@par}}
  1886.  
  1887.  \message{spacing,}
  1888. %      **********************************************
  1889. %      *     SPACING / LINE AND PAGE BREAKING       *
  1890. %      **********************************************
  1891. %
  1892. % USER COMMANDS:
  1893. % \nopagebreak[i] : i = 0,...,4.  Default argument = 4.  Puts a penalty
  1894. %                 into the vertical list output as follows:
  1895. %                   0 : penalty = 0
  1896. %                   1 : penalty = \@lowpenalty
  1897. %                   2 : penalty = \@medpenalty
  1898. %                   3 : penalty = \@highpenalty
  1899. %                   4 : penalty = 10000
  1900. % \pagebreak[i]   : same as \nopagebreak except negatives of its penalty
  1901. % \linebreak[i], \nolinebreak[i] : analogs of the above
  1902. % \samepage : inhibits page breaking most places by setting the following
  1903. %             penalties to 10000
  1904. %                    \interlinepenalty
  1905. %                    \postdisplaypenalty
  1906. %                    \interdisplaylinepenalty
  1907. %                    \@beginparpenalty
  1908. %                    \@endparpenalty
  1909. %                    \@itempenalty
  1910. %                    \@secpenalty
  1911. %                    \interfootnotelinepenalty
  1912. %
  1913. % \obeycr    : defines <CR> == \\.
  1914. % \restorecr : restores <CR> to its usual meaning.
  1915. %
  1916. % \\         : initially defined to be \newline
  1917. % \\[LENGTH] : initially defined to be \vspace{LENGTH}\newline
  1918. %              Note: \\* adds a \vadjust{\penalty 10000}
  1919.  
  1920. \def\nopagebreak{\@ifnextchar[{\@nopgbk}{\@nopgbk[4]}}
  1921. \def\@nopgbk[#1]{\ifvmode \penalty \@getpen{#1}\else
  1922. \@bsphack\vadjust{\penalty \@getpen{#1}}\@esphack\fi}
  1923.  
  1924. \def\pagebreak{\@ifnextchar[{\@pgbk}{\@pgbk[4]}}
  1925. \def\@pgbk[#1]{\ifvmode \penalty -\@getpen{#1}\else
  1926. \@bsphack\vadjust{\penalty -\@getpen{#1}}\@esphack\fi}
  1927.  
  1928. \def\nolinebreak{\@ifnextchar[{\@nolnbk}{\@nolnbk[4]}}
  1929. \def\@nolnbk[#1]{\ifvmode \@nolnerr\else \@tempskipa\lastskip
  1930.      \unskip \penalty \@getpen{#1}\ifdim \@tempskipa >\z@
  1931.      \hskip\@tempskipa\ignorespaces\fi\fi}
  1932.  
  1933. \def\linebreak{\@ifnextchar[{\@lnbk}{\@lnbk[4]}}
  1934. \def\@lnbk[#1]{\ifvmode \@nolnerr\else
  1935.      \unskip\penalty -\@getpen{#1}\fi}
  1936.  
  1937. \def\samepage{\interlinepenalty\@M
  1938.    \postdisplaypenalty\@M
  1939.    \interdisplaylinepenalty\@M
  1940.    \@beginparpenalty\@M
  1941.    \@endparpenalty\@M
  1942.    \@itempenalty\@M
  1943.    \@secpenalty\@M
  1944.    \interfootnotelinepenalty\@M}
  1945.  
  1946. % \nobreak added to \newline to prevent null lines when \newline
  1947. % ends an overfull line.  Change made 24 May 89 as suggested by
  1948. % Frank Mittelbach and Rainer Sch\"opf
  1949. %
  1950. \def\newline{\ifvmode \@nolnerr \else \unskip\nobreak\hfil
  1951.   \penalty -\@M\relax\fi}
  1952.  
  1953.  
  1954. \def\@normalcr{\@ifstar{\vadjust{\penalty\@M}\@xnewline}{\@xnewline}}
  1955.  
  1956. \def\@xnewline{\@ifnextchar[{\@newline}{\newline}}
  1957.  
  1958. \def\@newline[#1]{\ifhmode\unskip\fi\vspace{#1}\newline}
  1959.  
  1960. \let\\=\@normalcr
  1961.  
  1962. \def\@getpen#1{\ifcase #1 0 \or \@lowpenalty\or
  1963.          \@medpenalty \or \@highpenalty
  1964.          \else \@M \fi}
  1965.  
  1966. % @nobreak : Switch used to avoid page breaks caused by \label after a section
  1967. %            heading, etc. It should be GLOBALLY set true after the \nobreak
  1968. %            and GLOBALLY set false by the next invocation of \everypar.
  1969. %            Commands that reset \everypar should globally set it false
  1970. %            if appropriate.
  1971. %
  1972. \newif\if@nobreak \@nobreakfalse
  1973.  
  1974. % \@bsphack ... \@esphack
  1975. %     used by macros such as \index and \begin{@float} ... \end{@float}
  1976. %     that want to be invisible -- i.e.,
  1977. %     not leave any extra space when used in the middle of text.  Such
  1978. %     a macro should begin with \@bsphack and end with \@esphack
  1979. %     The macro in question should not create any text, nor change the
  1980. %     mode.
  1981. %
  1982. % \@bsphack ==
  1983. %  BEGIN
  1984. %   if not mmode then                 %% Test for math mode added 18 Dec 89
  1985. %         \dimen\@savsk := \lastskip
  1986. %       if  hmode  then  \@savsf := \spacefactor  fi
  1987. %   fi
  1988. %  END
  1989. %
  1990. % \@esphack ==
  1991. %  BEGIN
  1992. %   if not mmode then                 %% Test for math mode added 18 Dec 89
  1993. %    if  hmode
  1994. %      then  \spacefactor := \@savsf
  1995. %            if \dimen\@savsk > 0pt  then  \ignorespaces
  1996. %                                          \global\@ignoretrue   fi
  1997. %    fi
  1998. %   fi
  1999. %  END
  2000. %
  2001.  
  2002. \newdimen\@savsk
  2003. \newcount\@savsf
  2004.  
  2005. \def\@bsphack{\relax\ifmmode\else\@savsk\lastskip
  2006.     \ifhmode\@savsf\spacefactor\fi\fi}
  2007.  
  2008. \def\@esphack{\relax\ifmmode\else\ifhmode\spacefactor\@savsf
  2009.      {}\ifdim \@savsk >\z@ \global\@ignoretrue \ignorespaces
  2010.   \fi \fi\fi}
  2011.  
  2012. % VERTICAL SPACING:
  2013. %
  2014. % LaTeX supports the PLAIN TeX commands \smallskip, \medskip and \bigskip.
  2015. % However, it redefines them using \vspace instead of \vskip.
  2016. %
  2017. % Extra vertical space is added by the command command \addvspace{SKIP},
  2018. % which adds a vertical skip of SKIP to the document.  The sequence
  2019. %         \addvspace{S1} \addvspace{S2}
  2020. % is equivalent to
  2021. %         \addvspace{maximum of S1, S2}.
  2022. % \addvspace should be used only in vertical mode, and gives an error if it's
  2023. % not.  The \addvspace command does NOT add vertical space if
  2024. % @minipage = T. The minipage environment uses this to inhibit
  2025. % the addition of extra vertical space at the beginning.
  2026. %
  2027. % Penalties are put into the vertical list with the \addpenalty{PENALTY}
  2028. % command.  It works properly when \addpenalty and \addvspace commands
  2029. % are mixed.
  2030. %
  2031. % The @nobreak switch is set true used when in vertical mode and no page
  2032. % break should occur.  (Right now, it is used only by the section heading
  2033. % commands to inhibit page breaking after a heading.)
  2034. %
  2035. %
  2036. % \addvspace{SKIP} ==
  2037. %  BEGIN
  2038. %   if vmode
  2039. %     then if @minipage
  2040. %            else if \lastskip =0
  2041. %                    then  \vskip SKIP
  2042. %                    else  if \lastskip < SKIP
  2043. %                             then  \vskip -\lastskip
  2044. %                                   \vskip SKIP
  2045. %                             else if SKIP < 0 and \lastskip >= 0
  2046. %                                    then \vskip -\lastskip
  2047. %                                         \vskip \lastskip + SKIP
  2048. %          fi      fi       fi      fi
  2049. %     else 'missing \item' error.
  2050. %   fi
  2051. %  END
  2052.  
  2053. \def\addvspace#1{\ifvmode
  2054.      \if@minipage\else
  2055.           \ifdim \lastskip =\z@ \vskip #1\relax
  2056.              \else \@tempskipb#1\relax\@xaddvskip
  2057.      \fi\fi
  2058.   \else\@noitemerr\fi}
  2059.  
  2060. \def\@xaddvskip{\ifdim \lastskip <\@tempskipb\vskip-\lastskip\vskip
  2061.              \@tempskipb\relax
  2062.         \else  \ifdim \@tempskipb<\z@
  2063.                  \ifdim \lastskip <\z@
  2064.                     \else \advance\@tempskipb\lastskip
  2065.                            \vskip -\lastskip \vskip \@tempskipb
  2066.       \fi\fi\fi}
  2067.  
  2068. \def\addpenalty#1{\ifvmode
  2069.    \if@minipage\else\if@nobreak\else
  2070.       \ifdim\lastskip=\z@ \penalty#1\relax
  2071.          \else \@tempskipb\lastskip
  2072.                \vskip -\lastskip \penalty#1\vskip\@tempskipb
  2073.       \fi\fi\fi
  2074.    \else\@noitemerr\fi}
  2075.  
  2076. \def\vspace{\@ifstar{\@vspacer}{\@vspace}}
  2077. \def\@vspace#1{\ifvmode
  2078.     \dimen@\prevdepth \expandafter\vskip #1\vskip \z@\prevdepth\dimen@
  2079.        \else
  2080.         \@bsphack\vadjust{\dimen@\prevdepth
  2081.             \expandafter\vskip #1\vskip \z@\prevdepth\dimen@}\@esphack\fi}
  2082. \def\@vspacer#1{\ifvmode \dimen@\prevdepth
  2083.          \hrule height\z@ \nobreak \expandafter\vskip #1\vskip \z@
  2084.            \prevdepth\dimen@
  2085.         \else
  2086.          \@bsphack\vadjust{\dimen@\prevdepth \hrule height\z@ \nobreak
  2087.             \expandafter\vskip #1\vskip \z@ \prevdepth\dimen@}\@esphack\fi}
  2088.  
  2089. \def\smallskip{\vspace\smallskipamount}
  2090. \def\medskip{\vspace\medskipamount}
  2091. \def\bigskip{\vspace\bigskipamount}
  2092.  
  2093.  
  2094. % See list environment for explanation of the following macros.
  2095.  
  2096. \def\endtrivlist{\if@newlist\@noitemerr\fi
  2097.    \if@inlabel\indent\fi
  2098.    \ifhmode\unskip \par\fi
  2099.    \if@noparlist \else
  2100.       \ifdim\lastskip >\z@ \@tempskipa\lastskip \vskip -\lastskip
  2101.          \advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip
  2102.          \vskip\@tempskipa
  2103.    \fi\@endparenv\fi}
  2104.  
  2105. % CHANGES TO \@endparenv:
  2106. % Changed  \hskip -\parindent  to  \setbox0=\lastbox  so a \noindent
  2107. % becomes a no-op when used before a line immediately following a
  2108. % list environment.  (Changed 23 Oct 86)
  2109. %
  2110. % To suppress the paragraph indentation in text immediately following
  2111. % a paragraph-making environment, \everypar is changed to remove the
  2112. % space, and \par is redefined to restore \everypar.  Instead of redefining
  2113. % \par and \everpar, \@endparenv was changed to set the @endpe switch,
  2114. % letting \end redefine \par and \everypar.  This allows paragraph-
  2115. % making environments work right when called by other environments.
  2116. % (Changed 27 Oct 86)
  2117.  
  2118. \def\@endparenv{\addpenalty\@endparpenalty\addvspace\@topsepadd\@endpetrue}
  2119.  
  2120. \def\@doendpe{\@endpetrue
  2121.      \def\par{\@restorepar\everypar{}\par\@endpefalse}\everypar
  2122.                {\setbox0=\lastbox\everypar{}\@endpefalse}}
  2123.  
  2124. \newif\if@endpe
  2125. \@endpefalse
  2126.  
  2127. % HORIZONTAL SPACE
  2128. %
  2129. % \, : used in paragraph mode produces a \thinspace.  It has the ordinary
  2130. %      definition in math mode.  Useful for quotes inside quotes, as in
  2131. %      ``\,`Foo', he said.''
  2132. %
  2133. % \@ : placed before a '.', makes it a sentence-ending period.  Does the
  2134. %     right thing for other punctuation marks as well.  Does this by
  2135. %     setting spacefactor to 1000.
  2136.  
  2137. \def\,{\protect\pcomma}
  2138. \def\pcomma{\relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
  2139.  
  2140.  
  2141. \def\@{\spacefactor\@m}
  2142.  
  2143. \def\hspace{\protect\phspace}
  2144. \def\phspace{\@ifstar{\@hspacer}{\@hspace}}
  2145. \def\@hspace#1{\leavevmode\expandafter\hskip #1\relax}
  2146.  
  2147. \def\@hspacer#1{\leavevmode\vrule width\z@\nobreak\expandafter\hskip
  2148.                 #1\hskip \z@\relax}
  2149.                       %% extra \hskip 0pt added 12/17/85 to guard
  2150.                       %% against a following \unskip
  2151.                       %% \relax added 13 Oct 88 for usual TeX lossage
  2152.  
  2153. % define \fill to = 0pt plus 1fill
  2154. \newskip\fill \fill = 0pt plus 1fill
  2155.  
  2156. % \stretch{N} == 0pt plus N fill
  2157. \def\stretch#1{\z@ plus #1fill\relax}
  2158.  
  2159. {\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M=13 \def^^M{\\}\@gobblecr}%
  2160. \gdef\restorecr{\catcode`\^^M=5 }} %} BRACE MATCHING
  2161.  
  2162.  
  2163.  \message{control,}
  2164. %      **********************************************
  2165. %      *     PROGRAM CONTROL STRUCTURE MACROS       *
  2166. %      **********************************************
  2167. %
  2168. % \@whilenum TEST \do {BODY}
  2169. % \@whiledim TEST \do {BODY}  : These implement the loop
  2170. %           while  TEST  do  BODY  od
  2171. %     where  TEST  is a TeX \ifnum or \ifdim test, respectively.
  2172. %     They are optimized for the normal case of TEST initially false.
  2173. %
  2174. % \@whilesw SWITCH \fi {BODY} : Implements the loop
  2175. %               while SWITCH do BODY od
  2176. %     where SWITCH is a command defined by \newswitch.
  2177. %     Optimized for normal case of SWITCH initially false.
  2178. %
  2179. % \@for NAME := LIST \do {BODY} : Assumes that LIST expands to A1,A2, ... ,An .
  2180. %      Executes  BODY  n  times, with  NAME = Ai  on the i-th iteration.
  2181. %      Optimized for the normal case of n = 1.  Works for n=0.
  2182. %
  2183. % \@tfor NAME := LIST \do {BODY}
  2184. %      if, before expansion, LIST = T1 ... Tn  where each Ti is a
  2185. %      token or {...}, then executes  BODY  n  times, with  NAME = Ti
  2186. %      on the i-th iteration.  Works for n=0.
  2187. %
  2188. %  NOTES: 1. These macros use no \@temp sequences.
  2189. %         2. These macros do not work if the body contains anything that looks
  2190. %            syntactically to TeX like an improperly balanced \if \else \fi.
  2191. %
  2192. % \@whilenum TEST \do {BODY} ==
  2193. %  BEGIN
  2194. %    if  TEST
  2195. %      then  BODY
  2196. %            \@iwhilenum{TEST \relax BODY}
  2197. %  END
  2198. %
  2199. % \@iwhilenum {TEST BODY} ==
  2200. %  BEGIN
  2201. %    if  TEST
  2202. %      then  BODY
  2203. %            \@nextwhile = def(\@iwhilenum)
  2204. %      else  \@nextwhile = def(\@whilenoop)
  2205. %    fi
  2206. %    \@nextwhile {TEST BODY}
  2207. %  END
  2208. %
  2209. % \@whilesw SWITCH \fi {BODY} ==
  2210. %  BEGIN
  2211. %    if SWITCH
  2212. %      then BODY
  2213. %           \@iwhilesw {SWITCH BODY}\fi
  2214. %    fi
  2215. %  END
  2216. %
  2217. % \@iwhilesw {SWITCH BODY} \fi ==
  2218. %  BEGIN
  2219. %    if SWITCH
  2220. %      then BODY
  2221. %           \@nextwhile = def(\@iwhilesw)
  2222. %      else \@nextwhile = def(\@whileswnoop)
  2223. %    fi
  2224. %    \@nextwhile {SWITCH BODY} \fi
  2225. %  END
  2226.  
  2227. \def\@whilenoop#1{}
  2228. \def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax
  2229.      #2\relax}\fi}
  2230. \def\@iwhilenum#1{\ifnum #1\let\@nextwhile=\@iwhilenum
  2231.          \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}}
  2232.  
  2233. \def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi}
  2234. \def\@iwhiledim#1{\ifdim #1\let\@nextwhile=\@iwhiledim
  2235.         \else\let\@nextwhile=\@whilenoop\fi\@nextwhile{#1}}
  2236.  
  2237. \def\@whileswnoop#1\fi{}
  2238. \def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi}
  2239. \def\@iwhilesw#1\fi{#1\let\@nextwhile=\@iwhilesw
  2240.          \else\let\@nextwhile=\@whileswnoop\fi\@nextwhile{#1}\fi}
  2241.  
  2242. % \@for NAME := LIST \do {BODY} ==
  2243. %    BEGIN \@forloop expand(LIST),\@nil,\@nil \@@ NAME {BODY} END
  2244. %
  2245. % \@forloop CAR, CARCDR, CDRCDR \@@ NAME {BODY} ==
  2246. %   BEGIN
  2247. %     NAME = CAR
  2248. %     if def(NAME) = def(\@nnil)
  2249. %       else BODY;
  2250. %            NAME = CARCDR
  2251. %            if def(NAME) = def(\@nnil)
  2252. %              else BODY
  2253. %                   \@iforloop CDRCDR \@@ NAME \do {BODY}
  2254. %            fi
  2255. %     fi
  2256. %   END
  2257. %
  2258. % \@iforloop CAR, CDR \@@ NAME {BODY} =
  2259. %     NAME = CAR
  2260. %     if def(NAME) = def(\@nnil)
  2261. %        then  \@nextwhile = def(\@fornoop)
  2262. %        else  BODY ;
  2263. %              \@nextwhile = def(\@iforloop)
  2264. %     fi
  2265. %     \@nextwhile name cdr {body}
  2266. %
  2267. % \@tfor NAME := LIST \do {BODY}
  2268. %    =  \@tforloop LIST \@nil \@@ NAME {BODY}
  2269. %
  2270. % \@tforloop car cdr \@@ name {body} =
  2271. %     name = car
  2272. %     if def(name) = def(\@nnil)
  2273. %        then  \@nextwhile == \@fornoop
  2274. %        else  body ;
  2275. %              \@nextwhile == \@forloop
  2276. %     fi
  2277. %     \@nextwhile name cdr {body}
  2278. %
  2279.  
  2280. \def\@nnil{\@nil}
  2281. \def\@empty{}
  2282. \def\@fornoop#1\@@#2#3{}
  2283.  
  2284. \def\@for#1:=#2\do#3{\edef\@fortmp{#2}\ifx\@fortmp\@empty \else
  2285.     \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi}
  2286.  
  2287. \def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
  2288.        #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi}
  2289.  
  2290. \def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
  2291.        \let\@nextwhile=\@fornoop \else
  2292.       #4\relax\let\@nextwhile=\@iforloop\fi\@nextwhile#2\@@#3{#4}}
  2293.  
  2294. \def\@tfor#1:=#2\do#3{\xdef\@fortmp{#2}\ifx\@fortmp\@empty \else
  2295.     \@tforloop#2\@nil\@nil\@@#1{#3}\fi}
  2296. \def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
  2297.        \let\@nextwhile=\@fornoop \else
  2298.       #4\relax\let\@nextwhile=\@tforloop\fi\@nextwhile#2\@@#3{#4}}
  2299.  
  2300.  
  2301.  \message{files,}
  2302. %     ****************************************
  2303. %     *           FILE HANDLING              *
  2304. %     ****************************************
  2305. %
  2306. % THE FOLLOWING USER COMMANDS ARE DEFINED IN THIS PART:
  2307. %  \document            : Reads in the .AUX files and \catcode's @ to 12.
  2308. %  \nofiles             : Suppresses all file output by setting \@filesw false.
  2309. %  \includeonly{NAME1, ... ,NAMEn}
  2310. %                    : Causes only parts NAME1, ... ,NAMEn to be read by
  2311. %                      their \include commands.  Works by setting \@partsw true
  2312. %                      and setting \@partlist to NAME1, ... ,NAMEn.
  2313. %  \include{NAME}    : Does an \input NAME unless \partsw is true and
  2314. %                      NAME is not in \@partlist.  If \@filesw is true, then
  2315. %                      it directs .AUX output to NAME.AUX, including a
  2316. %                      checkpoint at the end.
  2317. % \input{NAME}       : The same as TeX's \input, except it allows optional
  2318. %                      braces around the file name.
  2319. %
  2320. %  VARIABLES, SWITCHES AND INTERNAL COMMANDS:
  2321. %    \@mainaux    : Output file number for main .AUX file.
  2322. %    \@partaux    : Output file number for current part's .AUX file.
  2323. %    \@auxout     : Either \@mainout or \@partout, depending on which .AUX
  2324. %                   file output goes to.
  2325. %    \@input{foo} : If file foo exists, then \input's it, otherwise types
  2326. %                   a warning message.
  2327. %    @filesw       : Switch -- set false if no .AUX, .TOC, .IDX etc files are
  2328. %                   to be
  2329. %    @partsw      : Set true by a \includeonly command.
  2330. %    \@partlist   : Set to the argument of the \includeonly command.
  2331. %
  2332. %    \cp@FOO      : The checkpoint for \include'd file FOO.TEX, written
  2333. %                   by \@writeckpt at the end of file FOO.AUX
  2334. %
  2335. % \document ==
  2336. %   BEGIN
  2337. %     \endgroup   % cancels \begingroup generated by \begin command
  2338. %     \@colht := \@colroom := \vsize := \textheight
  2339. %     \columnwidth := \textwidth
  2340. %     \@clubpenalty := \clubpenalty          % \@clubpenalty saves value.
  2341. %     IF @twocolumn = T
  2342. %       THEN \columnwidth := (\columnwidth - \columnsep)/2
  2343. %            @firstcolumn := T
  2344. %     FI
  2345. %     \hsize  := \linewidth := \columnwidth
  2346. %     \begingroup
  2347. %        \@floatplacement \@dblfloatplacement
  2348. %        \@input{\jobname.aux}
  2349. %     \endgroup
  2350. %     IF \@filesw = T
  2351. %       THEN  open file \@mainaux for writing
  2352. %             write ``\relax''on file \@mainaux
  2353. %     FI
  2354. %     \do{COMMAND} == BEGIN \let COMMAND = \@notprerr END
  2355. %     \@preamblecmds
  2356. %     \do == \noexpand
  2357. %     \@normalsize
  2358. %     \everypar{}
  2359. %   END
  2360. %
  2361. % \includeonly{FILELIST} ==
  2362. %  BEGIN
  2363. %   \@partsw   := T
  2364. %   \@partlist := FILELIST
  2365. %  END
  2366. %
  2367. % \include{FILE} ==
  2368. %  BEGIN
  2369. %   \clearpage
  2370. %   if \@filesw = T
  2371. %     then  \immediate\write\@mainaux{\string\@input{FILE.AUX}}
  2372. %   fi
  2373. %   if  \@partsw = T
  2374. %     then \@tempswa := F
  2375. %          \@tempb == FILE
  2376. %          for \@tempa := \@partlist
  2377. %              do if eval(\@tempa) = eval(\@tempb)
  2378. %                   then \@tempswa := T          fi
  2379. %              od
  2380. %   fi
  2381. %
  2382. %   if \@tempswa = T
  2383. %      then \@auxout := \@partaux
  2384. %           if \@filesw = T
  2385. %             then  \immediate\openout\@partaux{FILE.AUX}
  2386. %                   \immediate\write\@partaux{\relax}
  2387. %           fi
  2388. %           \@input{FILE.TEX}
  2389. %           \clearpage
  2390. %           \@writeckpt{FILE}
  2391. %           if @filesw then \closeout \@partaux fi
  2392.  
  2393. %           \@auxout := \@mainaux
  2394. %      else \cp@FILE
  2395. %   fi
  2396. %  END
  2397. %
  2398. % \@writeckpt{FILE} ==
  2399. %  BEGIN
  2400. %    if \@filesw = T
  2401. %        \immediate\write on file \@partaux:
  2402. %                  \gdef\cp@FILE{                  %% }
  2403. %        for \@tempa := \cl@@ckpt
  2404. %           do  \immediate\write on file \@partaux:
  2405. %                   \global\string\setcounter
  2406. %                       {eval(\@tempa)}{eval(\c@eval(\@tempa))}
  2407. %           od                                     %% {
  2408. %        \immediate\write on file \@partaux:  }
  2409. %    fi
  2410. %  END
  2411. %
  2412. %  INITIALIZATION
  2413. %    \@tempswa := T
  2414.  
  2415. \newif\if@filesw \@fileswtrue
  2416. \newif\if@partsw \@partswfalse
  2417. \newwrite\@mainaux
  2418. \newwrite\@partaux
  2419.  
  2420. \newcount\@clubpenalty
  2421.  
  2422. \def\document{\endgroup
  2423.   \@colht\textheight  \@colroom\textheight \vsize\textheight
  2424.    \columnwidth\textwidth \@clubpenalty\clubpenalty
  2425.    \if@twocolumn \advance\columnwidth -\columnsep
  2426.       \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
  2427.    \fi
  2428.   \hsize\columnwidth \linewidth\hsize
  2429.   \begingroup\@floatplacement\@dblfloatplacement
  2430.    \makeatletter\let\@writefile\@gobbletwo
  2431.    \@input{\jobname.aux}\endgroup
  2432.   \if@filesw \immediate\openout\@mainaux=\jobname.aux
  2433.     \immediate\write\@mainaux{\relax}\fi
  2434.   \def\do##1{\let ##1\@notprerr}%
  2435.   \@preamblecmds
  2436.   \let\do\noexpand
  2437.   \@normalsize\everypar{}}
  2438.  
  2439. \def\@gobbletwo#1#2{}
  2440.  
  2441. \def\nofiles{\@fileswfalse \typeout
  2442.    {No auxiliary output files.}\typeout{}}
  2443.  
  2444. \def\@input#1{\openin1 #1 \ifeof1 \typeout
  2445.   {No file #1.}\else\closein1 \relax\@@input #1 \fi}
  2446. \let\@auxout=\@mainaux
  2447.  
  2448. \def\includeonly#1{\@partswtrue\edef\@partlist{#1}}
  2449.  
  2450. % In the definition of \include, \def\@tempb changed to \edef\@tempb to
  2451. % be consistent with the \edef in \includeonly.  (Suggested by Rainer
  2452. % Sch\"opf & Frank Mittelbach.  Change made 20 Jul 88.)
  2453. %
  2454. % Changed definition of \include to allow space at end of file name--
  2455. % otherwise, typing \include{foo } would cause LaTeX to overwrite
  2456. % foo.tex.  Change made 24 May 89, suggested by Rainer Sch\"opf  and
  2457. % Frank Mittelbach
  2458.  
  2459. \def\include#1{\@include#1 }
  2460. \def\@include#1 {\clearpage
  2461. \if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
  2462. \@tempswatrue\if@partsw \@tempswafalse\edef\@tempb{#1}\@for
  2463. \@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi
  2464. \if@tempswa \if@filesw \let\@auxout=\@partaux
  2465. \immediate\openout\@partaux #1.aux
  2466. \immediate\write\@partaux{\relax}\fi\@input{#1.tex}\clearpage
  2467. \@writeckpt{#1}\if@filesw \immediate\closeout\@partaux \fi
  2468. \let\@auxout=\@mainaux\else\@nameuse{cp@#1}\fi}
  2469.  
  2470. \def\@writeckpt#1{\if@filesw
  2471. \immediate\write\@partaux{\string\global\string\@namedef{cp@#1}\@charlb}%
  2472. {\let\@elt\@wckptelt \cl@@ckpt}\immediate\write\@partaux{\@charrb}\fi}
  2473.  
  2474. \def\@wckptelt#1{\immediate\write\@partaux
  2475. {\string\setcounter{#1}{\the\@nameuse{c@#1}}}}
  2476.  
  2477. \def\input{\@ifnextchar \bgroup{\@iinput}{\@@input }}
  2478. \def\@iinput#1{\@@input #1 }
  2479.  
  2480. % The following defines \@charlb and \@charrb to be { and }, respectively
  2481. % with \catcode 11.
  2482. {\catcode`[=1 \catcode`]=2
  2483. \catcode`{=11 \catcode`}=11
  2484. \gdef\@charlb[{]
  2485. \gdef\@charrb[}]
  2486. ]% }brace matching
  2487.  
  2488.  
  2489.  \message{env. counters,}
  2490. %          ****************************************
  2491. %          *     ENVIRONMENT COUNTER MACROS       *
  2492. %          ****************************************
  2493. %
  2494. %  An environment  foo  has an associated counter defined by the
  2495. %  following control sequences:
  2496. %    \c@foo  :  Contains the counter's numerical value.  It is defined by
  2497. %                   \newcount\foocounter.
  2498. %    \thefoo : Macro that expands to the printed value of \foocounter.
  2499. %              For example, if sections are numbered within chapters,
  2500. %              and section headings look like
  2501. %                  Section II-3.  The Nature of Counters
  2502. %              then \thesection might be defined by:
  2503. %                 \def\thesection{\@Roman{\c@chapter}-\@arabic{\c@section}}
  2504. %
  2505. %    \p@foo  : Macro that expands to a printed 'reference prefix' of
  2506. %              counter foo.  Any \ref to a value created by counter
  2507. %              foo will produce the expansion of \p@foo\thefoo  when the
  2508. %              the \label command is executed.
  2509. %
  2510. % NOTE: \thefoo and \p@foo MUST BE DEFINED IN SUCH A WAY THAT
  2511. % \edef\bar{\thefoo} OR \edef\bar{\p@foo}
  2512. % DEFINES \bar SO THAT IT WILL EVALUATE TO THE COUNTER VALUE AT THE TIME
  2513. % OF THE \edef, EVEN AFTER \foocounter AND ANY OTHER COUNTERS HAVE BEEN
  2514. % CHANGED.  THIS WILL HAPPEN IF YOU USE THE STANDARD COMMANDS \@arabic,
  2515. % \@Roman, ETC.
  2516. %
  2517. %    \cl@foo : List of counters to be reset when foo stepped.  Has format
  2518. %              \@elt{countera}\@elt{counterb}\@elt{counterc}.
  2519. %
  2520. %  The following commands are used to define and modify counters.
  2521. %    \setcounter{FOO}{VAL}  : Globally sets \foocounter equal to VAL.
  2522. %    \addtocounter{FOO}{VAL}: Globally increments \foocounter by VAL.
  2523. %    \newcounter{NEWCTR}[OLDCTR] : Defines NEWCTR to be a counter, which is
  2524. %                             reset when counter OLDCTR is stepped.  If
  2525. %                             NEWCTR already defined produces 'c@NEWCTR
  2526. %                             already defined' error.
  2527. %    \value{CTR}           : produces the value of counter CTR, for use with
  2528. %                            a \setcounter or \addtocounter command.
  2529. %    \stepcounter{FOO}     : Globally increments counter \c@FOO
  2530. %                             and resets all subsidiary counters.
  2531. %    \refstepcounter{FOO}  : Same a \stepcounter, but it also defines
  2532. %                             \@currentreference so that a subsequent
  2533. %                             \label{bar} command causes \ref{bar} to
  2534. %                             generate the current value of counter foo.
  2535. %    \@definecounter{FOO}   : Initializes counter FOO (with empty reset list),
  2536. %                             defines \p@FOO and \theFOO to be null.
  2537. %                             Also adds FOO to \cl@@ckpt -- the reset
  2538. %                             list of a dummy counter @ckpt used for
  2539. %                             taking checkpoints.
  2540. %    \@addtoreset{FOO}{BAR} : Adds counter FOO to the list of counters
  2541. %                             \cl@BAR to be reset when counter bar is stepped.
  2542. %
  2543. %   NUMBERING MACROS:
  2544. %     \arabic{COUNTER} : Representation of COUNTER as arabic numerals.
  2545. %                        Changed 29 Apr 86 to make it print the obvious thing
  2546. %                        it COUNTER not positive.
  2547. %
  2548. %     \roman{COUNTER}  : Representation of COUNTER as lower-case
  2549. %                           Roman numerals.
  2550. %     \Roman{COUNTER}  : Representation of COUNTER as upper-case
  2551. %                           Roman numerals.
  2552. %     \alph{COUNTER}   : Representation of COUNTER as a lower-case
  2553. %                           letter: 1 = a, 2 = b, etc.
  2554. %     \Alph{COUNTER}   : Representation of COUNTER as an upper-case
  2555. %                           letter: 1 = A, 2 = B, etc.
  2556. %     \fnsymbol{COUNTER} : Representation of COUNTER as a footnote
  2557. %                           symbol: 1 = *, 2 = \dagger, etc.  Can be
  2558. %                           used only in math mode.
  2559. %
  2560. %  THE ABOVE ARE IMPLEMENTED IN TERMS OF THE FOLLOWING:
  2561. %     \@arabic\FOOcounter : Representation of \FOOcounter as arabic numerals.
  2562. %     \@roman\FOOcounter  : Representation of \FOOcounter as lower-case
  2563. %                           Roman numerals.
  2564. %     \@Roman\FOOcounter  : Representation of \FOOcounter as upper-case
  2565. %                           Roman numerals.
  2566. %     \@alph\FOOcounter   : Representation of \FOOcounter as a lower-case
  2567. %                           letter: 1 = a, 2 = b, etc.
  2568. %     \@Alph\FOOcounter   : Representation of \FOOcounter as an upper-case
  2569. %                           letter: 1 = A, 2 = B, etc.
  2570. %     \@fnsymbol\FOOcounter : Representation of \FOOcounter as a footnote
  2571. %                             symbol.  Can be used only in math mode.
  2572.  
  2573. \def\setcounter#1#2{\@ifundefined{c@#1}{\@nocnterr}%
  2574. {\global\csname c@#1\endcsname#2\relax}}
  2575.  
  2576. \def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocnterr}%
  2577. {\global\advance\csname c@#1\endcsname #2\relax}}
  2578.  
  2579. \def\newcounter#1{\expandafter\@ifdefinable \csname c@#1\endcsname
  2580.     {\@definecounter{#1}}\@ifnextchar[{\@newctr{#1}}{}}
  2581.  
  2582. \def\value#1{\csname c@#1\endcsname}
  2583.  
  2584. \def\@newctr#1[#2]{\@ifundefined{c@#2}{\@nocnterr}{\@addtoreset{#1}{#2}}}
  2585.  
  2586. \def\stepcounter#1{\global\expandafter\advance\csname c@#1\endcsname
  2587.      \@ne {\let\@elt\@stpelt \csname cl@#1\endcsname}}
  2588.  
  2589. \def\@stpelt#1{\global\csname c@#1\endcsname \z@}
  2590.  
  2591. \def\cl@@ckpt{\@elt{page}}
  2592.  
  2593. \def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname
  2594.      \setcounter{#1}0 \expandafter\gdef\csname cl@#1\endcsname{}\@addtoreset
  2595.      {#1}{@ckpt}\expandafter\gdef\csname p@#1\endcsname{}\expandafter
  2596.      \gdef\csname the#1\endcsname{\arabic{#1}}}
  2597.  
  2598. \def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}}
  2599.  
  2600. % Numbering commands for definitions of \theCOUNTER and \list arguments.
  2601. % \fnsymbol produces the standard footnoting symbols: asterisk, dagger, etc.
  2602. % They can be used only in math mode.
  2603.  
  2604. \def\arabic#1{\@arabic{\@nameuse{c@#1}}}
  2605. \def\roman#1{\@roman{\@nameuse{c@#1}}}
  2606. \def\Roman#1{\@Roman{\@nameuse{c@#1}}}
  2607. \def\alph#1{\@alph{\@nameuse{c@#1}}}
  2608. \def\Alph#1{\@Alph{\@nameuse{c@#1}}}
  2609. \def\fnsymbol#1{\@fnsymbol{\@nameuse{c@#1}}}
  2610.  
  2611. \def\@arabic#1{\number #1}  %% changed 29 Apr 86
  2612. \def\@roman#1{\romannumeral #1}
  2613. \def\@Roman#1{\expandafter\uppercase\expandafter{\romannumeral #1}}
  2614. \def\@alph#1{\ifcase#1\or a\or b\or c\or d\else\@ialph{#1}\fi}
  2615. \def\@ialph#1{\ifcase#1\or \or \or \or \or e\or f\or g\or h\or i\or j\or
  2616.    k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or
  2617.    z\else\@ctrerr\fi}
  2618. \def\@Alph#1{\ifcase#1\or A\or B\or C\or D\else\@Ialph{#1}\fi}
  2619. \def\@Ialph#1{\ifcase#1\or \or \or \or \or E\or F\or G\or H\or I\or J\or
  2620.    K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or
  2621.    Z\else\@ctrerr\fi}
  2622. \def\@fnsymbol#1{\ifcase#1\or *\or \dagger\or \ddagger\or
  2623.    \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger
  2624.    \or \ddagger\ddagger \else\@ctrerr\fi\relax}
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  \message{page nos.,}
  2630. %          ****************************************
  2631. %          *          PAGE NUMBERING              *
  2632. %          ****************************************
  2633. %
  2634. % Page numbers are produced by a page counter, used just like any other
  2635. % counter.  The only difference is that \c@page contains the number of
  2636. % the next page to be output (the one currently being produced), rather
  2637. % than one minus it.  Thus, it is normally initialized to 1 rather than
  2638. % 0.  \c@page is defined to be \count0, rather than a count assigned by
  2639. % \newcount.
  2640. %
  2641. % The user sets the pagenumber style with the \pagenumbering{FOO}
  2642. % command, which sets the page counter to 1 and defines \thepage to be
  2643. % \FOO.  For example, \pagenumbering{roman} causes pages to be numbered
  2644. % i, ii, etc.
  2645.  
  2646.  
  2647. \countdef\c@page=0 \c@page=1
  2648. \def\cl@page{}
  2649. \def\pagenumbering#1{\global\c@page \@ne \gdef\thepage{\csname @#1\endcsname
  2650.    \c@page}}
  2651.  
  2652.  
  2653.  \message{x-ref,}
  2654. %          ****************************************
  2655. %          *      CROSS REFERENCING MACROS        *
  2656. %          ****************************************
  2657. %
  2658. %  The user writes  \label{foo}  to define the following cross-references:
  2659. %     \ref{foo}     : value of most recently incremented referencable counter.
  2660. %                     in the current environment. (Chapter, section, theorem
  2661. %                     and enumeration counters counters are referencable,
  2662. %                     footnote counters are not.)
  2663. %     \pageref{foo} : page number at which \label{foo} command appeared.
  2664. %  where  foo  can be any string of characters not containing '\', '{' or '}'.
  2665. %
  2666. %  Note: The scope of the \label command is delimited by environments, so
  2667. %          \begin{theorem} \label{foo} ... \end{theorem} \label{bar}
  2668. %  defines \ref{foo} to be the theorem number and \ref{bar} to be
  2669. %  the current section number.
  2670. %
  2671. %  Note: \label does the right thing in terms of spacing -- i.e.,
  2672. %  leaving a space on both sides of it is equivalent to leaving
  2673. %  a space on either side.
  2674. %
  2675. %  This is implemented as follows.  A referencable counter  CNT  is
  2676. %  incremented by the command  \refstepcounter{CNT} , which sets
  2677. %  \@currentlabel == {CNT}{eval(\p@cnt\theCNT)}.   The command
  2678. %  \label{FOO} then writes the following on file \@auxout :
  2679. %        \newlabel{FOO}{{eval(\@currentlabel)}{eval(\thepage)}}
  2680. %
  2681. %  \ref{FOO} ==
  2682. %    BEGIN
  2683. %      if \r@foo undefined
  2684. %        then  ??
  2685. %              Warning: 'reference foo on page ... undefined'
  2686. %        else  \@car \eval(\r@FOO)\@nil
  2687. %      fi
  2688. %    END
  2689. %
  2690. %  \pageref{foo} =
  2691. %    BEGIN
  2692. %      if \r@foo undefined
  2693. %        then  ??
  2694. %              Warning: 'reference foo on page ... undefined'
  2695. %        else  \@cdr \eval(\r@FOO)\@nil
  2696. %      fi
  2697. %    END
  2698. %
  2699.  
  2700. \def\ref#1{\@ifundefined{r@#1}{{\bf ??}\@warning
  2701.    {Reference `#1' on page \thepage \space
  2702.     undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
  2703.     \@car\@tempa \@nil\null}}
  2704.  
  2705. \def\pageref#1{\@ifundefined{r@#1}{{\bf ??}\@warning
  2706.    {Reference `#1' on page \thepage \space
  2707.     undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter
  2708.     \@cdr\@tempa\@nil\null}}
  2709.  
  2710. \def\newlabel#1#2{\@ifundefined{r@#1}{}{\@warning{Label `#1' multiply
  2711.    defined}}\global\@namedef{r@#1}{#2}}
  2712.  
  2713. % \label and \refstepcounter changed to allow \protect'ed commands to
  2714. % work properly.  For example,
  2715. %   \def\thechapter{\protect\foo{\arabic{chapter}.\roman{section}}}
  2716. % will cause a \label{bar} command to define \ref{bar} to expand to
  2717. % something like \foo{4.d}.  Change made 20 Jul 88.
  2718.  
  2719. \def\label#1{\@bsphack\if@filesw {\let\thepage\relax
  2720.    \def\protect{\noexpand\noexpand\noexpand}%
  2721. \xdef\@gtempa{\write\@auxout{\string
  2722.       \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa
  2723.    \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
  2724.  
  2725. \def\refstepcounter#1{\stepcounter{#1}\let\@tempa\protect
  2726. \def\protect{\noexpand\protect\noexpand}%
  2727. \edef\@currentlabel{\csname p@#1\endcsname\csname the#1\endcsname}%
  2728. \let\protect\@tempa}
  2729.  
  2730. \def\@currentlabel{} % For \label commands that come before any environment
  2731.  
  2732.  \message{environments,}
  2733. %          ****************************************
  2734. %          *            ENVIRONMENTS              *
  2735. %          ****************************************
  2736. %
  2737. %  \begin{foo} and \end{foo} are used to delimit environment foo.
  2738. %  \begin{foo} starts a group and calls \foo if it is defined, otherwise
  2739. %  it does nothing.  \end{foo} checks to see that it matches the
  2740. %  corresponding \begin and if so, it calls \endfoo and does an
  2741. %  \endgroup.  Otherwise, \end{foo} does nothing.
  2742. %
  2743. %  If \end{foo} needs to ignore blanks after it, then \endfoo should
  2744. %  globally set the @ignore switch true with \global\@ignoretrue.
  2745. %
  2746. %  \@currenvir : the name of the current environment.  Initialized to
  2747. %                'document' to make \end{document} work right.
  2748. %
  2749. %  \@preamblecmds : a list of commands that can be used only in the
  2750. %                   preamble (before the \begin{document}), in the
  2751. %                   form  \do \CMDA \do \CMDB ... .   These commands
  2752. %                   are redefined to \@notprerr by \begin{document}
  2753. %                   to save space.  They include the following:
  2754. %                       \document \documentstyle \@documentstyle
  2755. %                       \@options \@preamblecmds \@optionlist
  2756. %                       \@optionfiles \nofiles \includeonly \makeindex
  2757. %                       \makeglossary
  2758. %                   The document style can add any other commands to
  2759. %                   this list by
  2760. %                      \def\do{\noexpand\do\noexpand}
  2761. %                      \edef\@preamblecmds{\@preamblecmds \do ...}
  2762. %
  2763. %  NOTE: \@@end is defined to be the \end command of TeX82.
  2764. %
  2765. %  \enddocument is the user's command for ending the manuscript file.
  2766. %
  2767. %  \stop is a panic button -- to end TeX in the middle.
  2768. %
  2769. % \enddocument ==
  2770. %   BEGIN
  2771. %    \@checkend{document}   %% checks for unmatched \begin
  2772. %    \clearpage
  2773. %    \begingroup
  2774. %      if @filesw = true
  2775. %        then  close file @mainaux
  2776. %              \global \@namedef {ARG1}{ARG2} == null
  2777. %              \newlabel{LABEL}{VAL} ==
  2778. %                  BEGIN
  2779. %                    \@tempa == VAL
  2780. %                    if def(\@tempa) = def(\r@LABEL)
  2781. %                      else @tempswa := true          fi
  2782. %                  END
  2783. %              \bibcite{LABEL}{VAL} == null
  2784. %                  BEGIN
  2785. %                    \@tempa == VAL
  2786. %                    if def(\@tempa) = def(\g@LABEL)
  2787. %                      else @tempswa := true          fi
  2788. %                  END
  2789. %              @tempswa := false
  2790. %              make @ a letter
  2791. %              \input \jobname.AUX
  2792. %              if @tempswa = true
  2793. %                then LaTeX Warning: 'Label may have changed.
  2794. %                                     Rerun to get cross-references right.'
  2795. %       fi     fi
  2796. %    \endgroup
  2797. %    finish up
  2798. %   END
  2799. %
  2800. %  \@writefile{EXT}{ENTRY} ==
  2801. %      if tf@EXT undefined
  2802. %        else \write\tf@EXT{ENTRY}
  2803. %      fi
  2804. %
  2805. \def\@currenvir{document}
  2806.  
  2807. \def\@preamblecmds{\do\document \do\documentstyle \do\@documentstyle
  2808.    \do\@options \do\@preamblecmds \do\@optionlist \do\@optionfiles
  2809.    \do\nofiles \do\includeonly \do\makeindex \do\makeglossary}
  2810.  
  2811. \newif\if@ignore
  2812.  
  2813. \def\enddocument{\@checkend{document}\clearpage\begingroup
  2814. \if@filesw \immediate\closeout\@mainaux
  2815. \def\global\@namedef##1##2{}\def\newlabel{\@testdef r}%
  2816. \def\bibcite{\@testdef b}\@tempswafalse \makeatletter\input \jobname.aux
  2817. \if@tempswa \@warning{Label(s) may have changed.  Rerun to get
  2818. cross-references right}\fi\fi\endgroup\deadcycles\z@\@@end}
  2819.  
  2820. \def\@testdef #1#2#3{\def\@tempa{#3}\expandafter \ifx \csname #1@#2\endcsname
  2821.  \@tempa  \else \@tempswatrue \fi}
  2822.  
  2823. \def\@writefile#1#2{\@ifundefined{tf@#1}{}{\expandafter
  2824.    \immediate\write\csname tf@#1\endcsname{#2}}}
  2825.  
  2826. \def\stop{\clearpage\deadcycles\z@\let\par\@@par\@@end}
  2827.  
  2828. \everypar{\@nodocument} %% To get an error if text appears before the
  2829. \nullfont               %% \begin{document}
  2830.  
  2831. % \begin, \end, and \@checkend changed so \end{document} will catch
  2832. % an unmatched \begin.  Changed 24 May 89 as suggested by
  2833. % Frank Mittelbach and Rainer Sch\"opf.
  2834.  
  2835.  
  2836. % \begin{NAME} ==
  2837. %  BEGIN
  2838. %    IF \NAME undefined  THEN  \@tempa == BEGIN report error END
  2839. %                        ELSE  \@tempa ==  (\@currenvir :=L NAME) \NAME
  2840. %    FI
  2841. %    @ignore :=G F      %% Added 30 Nov 88
  2842. %    \begingroup
  2843. %    \@currenvir :=L NAME
  2844. %    \NAME
  2845. %  END
  2846.  
  2847. % \end{NAME} ==
  2848. %  BEGIN
  2849. %   \endNAME
  2850. %   \@checkend{NAME}
  2851. %   IF @endpe = T                  %% @endpe set True by \@endparenv
  2852. %     THEN \@gtempa :=G \@doendpe  %% \@doendpe redefines \par and \everypar
  2853. %     ELSE \@gtempa :=G \relax     %% to suppress paragraph indentation in
  2854. %   FI                             %% immediately following text
  2855. %   \endgroup
  2856. %   \@gtempa
  2857. %   IF @ignore = T
  2858. %     THEN @ignore :=G F
  2859. %          \ignorespaces
  2860. %   FI
  2861. %  END
  2862.  
  2863. % \@checkend{NAME} ==
  2864. %  BEGIN
  2865. %   IF \@currenvir = NAME
  2866. %     ELSE \@badend{NAME}
  2867. %   FI
  2868. %  END
  2869.  
  2870. \def\begin#1{\@ifundefined{#1}{\def\@tempa{\@latexerr{Environment #1
  2871.   undefined}\@eha}}{\def\@tempa{\def\@currenvir{#1}%
  2872.   \csname #1\endcsname}}\begingroup\@endpefalse\@tempa}
  2873.  
  2874. \def\end#1{\csname end#1\endcsname\@checkend{#1}%
  2875.      \if@endpe\global\let\@gtempa\@doendpe
  2876.      \else\global\let\@gtempa\relax\fi
  2877.     \endgroup
  2878.      \@gtempa
  2879.      \if@ignore \global\@ignorefalse
  2880.                                \ignorespaces\fi}
  2881.  
  2882. \def\@checkend#1{\def\@tempa{#1}\ifx
  2883.       \@tempa\@currenvir \else\@badend{#1}\fi}
  2884.  
  2885.  
  2886.  \message{math,}
  2887. %      **********************************************
  2888. %      *               MATH ENVIRONMENTS            *
  2889. %      **********************************************
  2890. %
  2891. % \( ==  BEGIN  if math mode
  2892. %                 then error: '\( in math mode'
  2893. %                 else $
  2894. %               fi
  2895. %        END
  2896. %
  2897. % \) ==  BEGIN  if math mode
  2898. %                 then if inner mode
  2899. %                        then $
  2900. %                        else error ``\[ closed with \)''
  2901. %                 else error 'unmatched \)'
  2902. %               fi
  2903. %        END
  2904. %
  2905. % \[ ==  BEGIN  if math mode
  2906. %                 then error: '\[ in math mode'
  2907. %                 else $$
  2908. %               fi
  2909. %        END
  2910. %
  2911. % \] ==  BEGIN  if math mode
  2912. %                 then if inner mode
  2913. %                        then error '\( closed with \]'
  2914. %                        else $$
  2915. %                 else error 'unmatched \]'
  2916. %               fi
  2917. %        END
  2918. %
  2919. % \equation      ==  BEGIN \refstepcounter{equation} $$ END
  2920. %
  2921. % \endequation   ==  BEGIN \eqno (\theequation) $$\ignorespaces END
  2922. %
  2923. % NOTE: The document style must define \theequation etc., and do
  2924. % the appropriate \@addtoreset.  It should also redefine \@eqnnum
  2925. % if another format for the equation number is desired other than the
  2926. % standard (...), or to move the equation numbers to the flushleft.
  2927. % (See comment on the \def of \@eqnnum.)
  2928. %
  2929. % \stackrel{TOP}{BOT} == PLAIN TeX's \buildrel {TOP} \over {BOT}
  2930. %
  2931. % \frac{TOP}{BOT} == {TOP \over BOT}
  2932. %
  2933. % \sqrt[N]{EXP} produces an Nth root of EXP formula.
  2934. %
  2935. %  \: == \>  (medium space)
  2936.  
  2937. \def\({\relax\ifmmode\@badmath\else$%%$BRACE MATCH HACK
  2938. \fi}
  2939.  
  2940. \def\){\relax\ifmmode\ifinner$\else\@badmath%%$ BRACE MATCH HACK
  2941. \fi\else \@badmath\fi}
  2942.  
  2943. \def\[{\relax\ifmmode\@badmath\else
  2944.     \ifvmode \nointerlineskip \makebox[.6\linewidth]\fi$$%%$$ BRACE MATCH HACK
  2945. \fi}
  2946.  
  2947. \def\]{\relax\ifmmode\ifinner\@badmath\else$$\fi%%$$ BRACE MATCH HACK
  2948.         \else \@badmath \fi\ignorespaces}
  2949.  
  2950. \let\math=\(
  2951. \let\endmath=\)
  2952. \def\displaymath{\[}
  2953. \def\enddisplaymath{\]\global\@ignoretrue}
  2954.  
  2955. \@definecounter{equation}
  2956. \def\equation{$$ % $$ BRACE MATCHING HACK
  2957. \refstepcounter{equation}}
  2958.  
  2959. \def\endequation{\eqno \@eqnnum % $$ BRACE MATCHING HACK
  2960. $$\global\@ignoretrue}
  2961.  
  2962. %  \@eqnnum: Produces the equation number for equation and
  2963. %     eqnarray environments.  The following definition is for
  2964. %     flushright numbers; for flushleft numbers, see leqno.doc.
  2965. %     The {\rm ... } puts the equation number in roman type even if
  2966. %     an eqnarray environment appears in an italic environment.
  2967. %
  2968. \def\@eqnnum{{\rm (\theequation)}}
  2969.  
  2970.  
  2971. \def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}}
  2972. \def\frac#1#2{{#1\over #2}}
  2973.  
  2974. \let\@@sqrt=\sqrt
  2975. \def\sqrt{\@ifnextchar[{\@sqrt}{\@@sqrt}}
  2976. \def\@sqrt[#1]{\root #1\of}
  2977.  
  2978. \let\:=\>
  2979.  
  2980. % Here's the eqnarray environment:
  2981. %  Default is for left-hand side of equations to be flushleft.
  2982. %  To make them flushright, \let\@eqnsel = \hfil
  2983.  
  2984. \newcount\@eqcnt
  2985. \newcount\@eqpen
  2986. \newif\if@eqnsw\@eqnswtrue
  2987.  
  2988. \@centering = 0pt plus 1000pt % Changed 11/4/85 to produce warning message
  2989.                               % if line extends into margin.  Doesn't warn
  2990.                               % about formula overprinting equation number.
  2991.  
  2992. \def\eqnarray{\stepcounter{equation}\let\@currentlabel=\theequation
  2993. \global\@eqnswtrue
  2994. \global\@eqcnt\z@\tabskip\@centering\let\\=\@eqncr
  2995. $$\halign to \displaywidth\bgroup\@eqnsel\hskip\@centering
  2996.   $\displaystyle\tabskip\z@{##}$&\global\@eqcnt\@ne
  2997.   \hskip 2\arraycolsep \hfil${##}$\hfil
  2998.   &\global\@eqcnt\tw@ \hskip 2\arraycolsep $\displaystyle\tabskip\z@{##}$\hfil
  2999.    \tabskip\@centering&\llap{##}\tabskip\z@\cr}
  3000.  
  3001. \def\endeqnarray{\@@eqncr\egroup
  3002.       \global\advance\c@equation\m@ne$$\global\@ignoretrue}
  3003.  
  3004. \let\@eqnsel=\relax
  3005.  
  3006. \def\nonumber{\global\@eqnswfalse}
  3007.  
  3008. \def\@eqncr{{\ifnum0=`}\fi\@ifstar{\global\@eqpen\@M
  3009.     \@yeqncr}{\global\@eqpen\interdisplaylinepenalty \@yeqncr}}
  3010.  
  3011. \def\@yeqncr{\@ifnextchar [{\@xeqncr}{\@xeqncr[\z@]}}
  3012.  
  3013. \def\@xeqncr[#1]{\ifnum0=`{\fi}\@@eqncr
  3014.    \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}
  3015.  
  3016. \def\@@eqncr{\let\@tempa\relax
  3017.     \ifcase\@eqcnt \def\@tempa{& & &}\or \def\@tempa{& &}
  3018.       \else \def\@tempa{&}\fi
  3019.      \@tempa \if@eqnsw\@eqnnum\stepcounter{equation}\fi
  3020.      \global\@eqnswtrue\global\@eqcnt\z@\cr}
  3021.  
  3022. % Here's the eqnarray* environment:
  3023.  
  3024. \let\@seqncr=\@eqncr
  3025. \@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray}
  3026. \@namedef{endeqnarray*}{\nonumber\endeqnarray}
  3027.  
  3028. % \lefteqn{FORMULA} typesets FORMULA in display math style
  3029. %  flushleft in a box of width zero.
  3030. %
  3031.  
  3032. \def\lefteqn#1{\hbox to \z@{$\displaystyle #1$\hss}}
  3033.  
  3034.  
  3035.  \message{center,}
  3036. %      ************************************************
  3037. %      *      CENTER, FLUSHRIGHT, FLUSHLEFT, ETC.     *
  3038. %      ************************************************
  3039. %
  3040. %
  3041. % \center, \flushright and \flushleft set
  3042. %   \rightskip = 0pt or \@flushglue (as appropriate)
  3043. %   \leftskip  = 0pt or \@flushglue (as appropriate)
  3044. %   \parindent = 0pt
  3045. %   \parfillskip   = 0pt. (except \flushleft)
  3046. %   \\         == \par \vskip -\parskip
  3047. %   \\[LENGTH] == \\ \vskip LENGTH
  3048. %   \\*        == \par \penalty 10000 \vskip -\parskip
  3049. %   \\*[LEN]   == \\* \vskip LENGTH
  3050. %
  3051. % They invoke the trivlist environment to handle vertical spacing before
  3052. % and after them.
  3053. %
  3054. % \centering, \raggedright and \raggedleft are the declaration analogs
  3055. % of the above.
  3056. %
  3057. % \raggedright has a more universal effect, however.  It sets
  3058. % \@rightskip := flushglue.  Every environment, like the list environments,
  3059. % that set \rightskip to its 'normal' value set it to \@rightskip
  3060.  
  3061. \def\@centercr{\ifhmode \unskip\else \@badcrerr\fi
  3062.        \par\@ifstar{\penalty \@M\@xcentercr}{\@xcentercr}}
  3063.  
  3064. \def\@xcentercr{\addvspace{-\parskip}\@ifnextchar
  3065.     [{\@icentercr}{\ignorespaces}}
  3066.  
  3067. \def\@icentercr[#1]{\vskip #1\ignorespaces}
  3068.  
  3069. \def\center{\trivlist \centering\item[]}
  3070. \def\centering{\let\\=\@centercr\rightskip\@flushglue\leftskip\@flushglue
  3071. \parindent\z@\parfillskip\z@}
  3072. \let\endcenter=\endtrivlist
  3073.  
  3074. \newskip\@rightskip \@rightskip \z@
  3075.  
  3076. \def\flushleft{\trivlist \raggedright\item[]}
  3077. \def\raggedright{\let\\=\@centercr\@rightskip\@flushglue \rightskip\@rightskip
  3078.   \leftskip\z@
  3079.   \parindent\z@}
  3080. \let\endflushleft=\endtrivlist
  3081.  
  3082. \def\flushright{\trivlist \raggedleft\item[]}
  3083. \def\raggedleft{\let\\=\@centercr\rightskip\z@\leftskip\@flushglue
  3084.   \parindent\z@\parfillskip\z@}
  3085. \let\endflushright=\endtrivlist
  3086.  
  3087.  \message{verbatim,}
  3088. %       ****************************************
  3089. %       *              VERBATIM                *
  3090. %       ****************************************
  3091. %
  3092. %  The verbatim environment uses the fixed-width \tt font, turns blanks into
  3093. %  spaces, starts a new line for each carrige return (or sequence of
  3094. %  consecutive carriage returns), and interprets EVERY character literally.
  3095. %  I.e., all special characters \, {, $, etc. are \catcode'd to 'other'.
  3096. %
  3097. %  The command \verb produces in-line verbatim text, where the argument
  3098. %  is delimited by any pair of characters.  E.g., \verb #...# takes
  3099. %  '...' as its argument, and sets it verbatim in \tt font.
  3100. %
  3101. %  The *-variants of these commands is the same, except that spaces
  3102. %  print as the TeXbook's space character instead of as blank spaces.
  3103.  
  3104. {\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar
  3105. {\@gobble}{\ignorespaces}}}
  3106.  
  3107. {\catcode`\ =\active\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
  3108.  
  3109. % Definition of \@xobeysp chaned on 19 Nov 86 from
  3110. % \def\@xobeysp{\leavevmode{} }
  3111. % to prevent line breaks at spaces.  Change suggested by
  3112. % Nelson Beebe
  3113. %
  3114. \def\@xobeysp{\leavevmode\penalty10000\ }
  3115.  
  3116.  
  3117.  
  3118. \begingroup \catcode `|=0 \catcode `[= 1
  3119. \catcode`]=2 \catcode `\{=12 \catcode `\}=12
  3120. \catcode`\\=12 |gdef|@xverbatim#1\end{verbatim}[#1|end[verbatim]]
  3121. |gdef|@sxverbatim#1\end{verbatim*}[#1|end[verbatim*]]
  3122. |endgroup
  3123.  
  3124. % \@sverbatim obsolete -- removed 24 May 89, as suggested by
  3125. % Rainer Sch\"opf and Frank Mittelbach
  3126. % \def\@sverbatim{\obeyspaces\@verbatim}
  3127.  
  3128. \def\@gobble#1{}
  3129.  
  3130. \def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
  3131. \leftskip\@totalleftmargin\rightskip\z@
  3132. \parindent\z@\parfillskip\@flushglue\parskip\z@
  3133. \@tempswafalse \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par}
  3134. \obeylines \tt \catcode``=13 \@noligs \let\do\@makeother \dospecials}
  3135.  
  3136. \def\verbatim{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim}
  3137. \let\endverbatim=\endtrivlist
  3138.  
  3139. \@namedef{verbatim*}{\@verbatim\@sxverbatim}
  3140. \expandafter\let\csname endverbatim*\endcsname =\endtrivlist
  3141.  
  3142.  
  3143. \def\@makeother#1{\catcode`#112\relax}
  3144.  
  3145. \def\verb{\begingroup \catcode``=13 \@noligs
  3146. \tt \let\do\@makeother \dospecials
  3147. \@ifstar{\@sverb}{\@verb}}
  3148.  
  3149. % Definitions of \@sverb and \@verb changed so \verb+ foo+  does not lose
  3150. % leading blanks when it comes at the beginning of a line.
  3151. % Change made 24 May 89. Suggested by Frank Mittelbach and Rainer Sch\"opf.
  3152. %
  3153. \def\@sverb#1{\def\@tempa ##1#1{\leavevmode\null##1\endgroup}\@tempa}
  3154.  
  3155. \def\@verb{\@vobeyspaces \frenchspacing \@sverb}
  3156.  
  3157.  
  3158. %% \@noligs prevents ?` and !` from being treated as ligatures
  3159. %% added 19 April 86
  3160.  
  3161.  
  3162. \begingroup
  3163. \catcode``=13
  3164. \gdef\@noligs{\let`=\@lquote}
  3165. \endgroup
  3166.  
  3167. \def\@lquote{{\kern\z@}`}
  3168.  \message{list,}
  3169. %       ****************************************
  3170. %       *         THE LIST ENVIRONMENT         *
  3171. %       ****************************************
  3172. %
  3173. % The generic commands for creating an indented environment -- enumerate,
  3174. % itemize, quote, etc -- are
  3175. %        \list{LABEL}{COMMANDS} ... \endlist
  3176. % which can be invoked by the user as the list environment.  The LABEL
  3177. % argument specifies item labeling.  COMMANDS contains commands for
  3178. % changing the horizontal and vertical spacing parameters.
  3179. %
  3180. % Each item of the environment is begun by the command \item[ITEMLABEL]
  3181. % which produces an item labeled by ITEMLABEL.  If the argument is
  3182. % missing, then the LABEL argument of the \list command is used as the
  3183. % item label.
  3184. %
  3185. % The label is formed by putting \makelabel{ITEMLABEL} in an hbox whose
  3186. % width is either its natural width or else \labelwidth, whichever is
  3187. % larger.  The \list command defines \makelabel to have the default
  3188. % definition
  3189. %     \makelabel{ARG} == BEGIN \hfil ARG END
  3190. % which, for a label of width less than \labelwidth, puts the label
  3191. % flushright, \labelsep to the left of the item's text.  However,
  3192. % \makelabel can be \let to another command by the \list's COMMANDS
  3193. % argument.
  3194. %
  3195. % A \usecounter{foo} command in the second argument causes the counter
  3196. % foo to be initialized to zero, and stepped by every \item command
  3197. % without an argument.  (\label commands within the list refer to this
  3198. % counter.)
  3199. %
  3200. % When you leave a list environment, returning either to an enclosing
  3201. % list or normal text mode, LaTeX begins a new paragraph if and only if
  3202. % you leave a blank line after the \end command.  This is accomplished
  3203. % by the \@endparenv command.
  3204. %
  3205. % Blank lines are ignored every other reasonable place--i.e.:
  3206. %     - Between the \begin{list} and the first \item,
  3207. %     - Between the \item and the text of that item.
  3208. %     - Between the end of the last item and the \end{list}.
  3209. %
  3210. % For an environment like quotation, in which items are not labeled,
  3211. % the entire environment is a single item.  It is defined by
  3212. % letting \quotation == \list{}{...}\item[].  (Note the [], there in
  3213. % case the first character in the environment is a '['.)  The spacing
  3214. % parameters provide a great deal of flexability in designing the
  3215. % format, including the ability to let the indentation of the first
  3216. % paragraph be different from that of the subsequent ones.
  3217. %
  3218. % The trivlist environment is equivalent to a list environment
  3219. % whose second argument sets the following parameter values:
  3220. %    \leftmargin = 0 : causes no indentation of left margin
  3221. %    \labelwidth = 0 : see below for precise effect this has.
  3222. %    \itemindent = 0 : with a null label, makes first paragraph
  3223. %        have no indentation.  Succeeding paragraphs have \parindent
  3224. %        indentation.  To give first paragraph same indentation, set
  3225. %        \itemindent = \parindent before the \item[].
  3226. % Every \item in a trivlist environment must have an argument---in many
  3227. % cases, this will be the null argument (\item[]).  The trivlist
  3228. % environment is mainly used for paragraphing environments, like
  3229. % verbatim, in which there is no margin change.  It provides the same
  3230. % vertical spacing as the list environment, and works reasonably well
  3231. % when it occurs immediately after an \item command in an enclosing list.
  3232. %
  3233. % The following variables are used inside a list environment:
  3234. %   \@totalleftmargin : The distance that the prevailing left margin is
  3235. %                       indented from the outermost left margin,
  3236. %   \linewidth        : The width of the current line.  Must be
  3237. %                       initialized to \hsize.
  3238. %   \@listdepth       : A count for holding current list nesting depth.
  3239. %   \makelabel        : A macro with a single argument, used to generate
  3240. %                       the label from the argument (given or implied) of the
  3241. %                       \item command.  Initialized to \@mklab by the \list
  3242. %                       command.  This command must produce some stretch--i.e.,
  3243. %                       an \hfil.
  3244. %   @inlabel          : A switch that is false except between the time an
  3245. %                       \item is encountered and the time that TeX actually
  3246. %                       enters horizontal mode.  Should be tested by
  3247. %                       commands that can be messed up by the list
  3248. %                       environment's use of \everypar.
  3249. %   \box\@labels      : When @inlabel = true, it holds the labels
  3250. %                       to be put out by \everypar.
  3251. %   @noparitem        : A switch set by \list when @inlabel = true.
  3252. %                       Handles the case of a \list being the first thing
  3253. %                       in an item.
  3254. %   @noparlist        : A switch set true for a list that begins an
  3255. %                       item.  No \topsep space is added before or after
  3256. %                       such a list.
  3257. %   @newlist          : Set true by \list, set false by the first \item's
  3258. %                       text (by \everypar).
  3259. %   @noitemarg        : Set true when executing an \item with no explicit
  3260. %                       argument.  Used to save space.  To save time,
  3261. %                       make two separate \@item commands.
  3262. %   @nmbrlist         : Set true by \usecounter command, causes list to
  3263. %                       be numbered.
  3264. %   \@listctr         : \def'ed by \usecounter to name of counter.
  3265. %   @noskipsec        : A switch set true by a sectioning command when it is
  3266. %                       creating an in-text heading with \everypar.
  3267. %
  3268. % Throughout a list environment, \hsize is the width of the current
  3269. % line, measured from the outermost left margin to the outermost right
  3270. % margin.  Environments like tabbing should use \linewidth instead of
  3271. % \hsize.
  3272. %
  3273. % Here are the parameters of a list that can be set by commands in
  3274. % the \list's COMMANDS argument.  These parameters are all TeX
  3275. % skips or dimensions (defined by \newskip or \newdimen), so the usual
  3276. % TeX or LaTeX commands can be used to set them.  The commands will
  3277. % be executed in vmode if and only if the \list was preceded by a
  3278. % \par (or something like an \end{list}), so the spacing parameters
  3279. % can be set according to whether the list is inside a paragraph
  3280. % or is its own paragraph.
  3281. %
  3282. %   VERTICAL SPACING (skips):
  3283. %
  3284. %      \topsep  : Space between first item and preceding paragraph.
  3285. %      \partopsep : Extra space added to \topsep when environment starts
  3286. %                   a new paragraph (is called in vmode).
  3287. %      \itemsep : Space between successive items.
  3288. %      \parsep  : Space between paragraphs within an item -- the \parskip
  3289. %                 for this environment.
  3290. %
  3291. %   PENALTIES
  3292. %     \@beginparpenalty : put at the beginning of a list
  3293. %     \@endparpenalty   : put at end of list
  3294. %     \@itempenalty     : put between items.
  3295. %
  3296. %   HORIZONTAL SPACING (dimens)
  3297. %      \leftmargin    : space between left margin of enclosing environment
  3298. %                       (or of page if top level list) and left margin of
  3299. %                       this list.  Must be nonnegative.
  3300. %      \rightmargin   : analogous.
  3301. %      \listparindent : extra indentation at beginning of every paragraph
  3302. %                       of a list except the one started by the \item
  3303. %                       command.  May be negative!  Usually, labeled lists
  3304. %                       have \listparindent equal to zero.
  3305. %      \itemindent    : extra indentation added right BEFORE an item label.
  3306. %      \labelwidth    : nominal width of box that contains the label.
  3307. %                       If the natural width of the label < = \labelwidth,
  3308. %                       then the label is flushed right inside a box
  3309. %                       of width \labelwidth (with an \hfil).  Otherwise,
  3310. %                       a box of the natural width is employed, which causes
  3311. %                       an indentation of the text on that line.
  3312. %      \labelsep      : space between end of label box and text of
  3313. %                       first item.
  3314. %
  3315. %   DEFAULT VALUES:
  3316. %      Defaults for the list environment are set as follows.
  3317. %      First, \rightmargin, \listparindent and \itemindent are set
  3318. %      to 0pt.  Then, one of the commands \@listi, \@listii, ... , \@listvi
  3319. %      is called, depending upon the current level of the list.
  3320. %      The \@list... commands should be defined by the document
  3321. %      style.  A convention that the document style should follow is
  3322. %      to set \leftmargin to \leftmargini, ... , \leftmarginvi for
  3323. %      the appropriate level.  Items that aren't changed may be left
  3324. %      alone, but everything that could possibly be changed must be
  3325. %      reset.
  3326. %
  3327. %  \list{LABEL}{COMMANDS} ==
  3328. %   BEGIN
  3329. %     if \@listdepth > 5
  3330. %       then LaTeX error: 'Too deeply nested'
  3331. %       else \@listdepth :=G \@listdepth + 1
  3332. %     fi
  3333. %     \rightmargin     := 0pt
  3334. %     \listparindent   := 0pt
  3335. %     \itemindent      := 0pt
  3336. %     \eval(@list \romannumeral\the\@listdepth)  %% Set default values:
  3337. %     \@itemlabel      :=L LABEL
  3338. %     \makelabel       == \@mklab
  3339. %     @nmbrlist        :=L false
  3340. %     COMMANDS
  3341. %
  3342. %     \@trivlist                % commands common to \list and \trivlist
  3343. %
  3344. %     \parskip          :=L \parsep
  3345. %     \parindent        :=L \listparindent
  3346. %     \linewidth        :=L \linewidth - \rightmargin -\leftmargin
  3347. %     \@totalleftmargin :=L \@totalleftmargin + \leftmargin
  3348. %     \parshape 1 \@totalleftmargin \linewidth
  3349. %     \ignorespaces                    % gobble space up to \item
  3350. %    END
  3351. %
  3352. % \endlist == BEGIN \@listdepth :=G \@listdepth -1
  3353. %                   \endtrivlist
  3354. %             END
  3355. %
  3356. % \@trivlist ==
  3357. %  BEGIN
  3358. %     if @newlist = T then \@noitemerr fi  %% This command removed for some
  3359. %                                          %% forgotten reason.
  3360. %     \@topsepadd :=L \topsep
  3361. %     if @noskipsec then leave vertical mode fi  %% Added 11 Jun 85
  3362. %     if vertical mode
  3363. %       then \@topsepadd :=L \@topsepadd + \partopsep
  3364. %       else \unskip \par                % remove glue from end of last line
  3365. %     fi
  3366. %     if @inlabel = true
  3367. %        then @noparitem :=L true
  3368. %             @noparlist :=L true
  3369. %        else @noparlist :=L false
  3370. %             \@topsep   :=L \@topsepadd
  3371. %     fi
  3372. %     \@topsep         :=L \@topsep + \parskip  %% Change 4 Sep 85
  3373. %     \leftskip        :=L 0pt           % Restore paragraphing parameters
  3374. %     \rightskip       :=L \@rightskip
  3375. %     \parfillskip     :=L 0pt + 1fil
  3376. %
  3377. %   NOTE: \@setpar called on every \list in case \par has been temporarily
  3378. %         munged before the \list command.
  3379. %     \@setpar{if @newlist = false then {\@@par} fi}
  3380. %     \@newlist         :=G T
  3381. %     \@outerparskip    :=L \parskip
  3382. % END
  3383. %
  3384. % \trivlist  ==
  3385. % BEGIN
  3386. %  \parsep     := \parskip
  3387. %  \@trivlist
  3388. %  \labelwidth := 0
  3389. %  \leftmargin := 0
  3390. %  \itemindent := \parindent
  3391. %  \makelabel{LABEL} == LABEL
  3392. % END
  3393. %
  3394. % \endtrivlist ==
  3395. %   BEGIN
  3396. %     if @inlabel = T then \indent fi
  3397. %     if horizontal mode then \unskip \par fi
  3398. %     if @noparlist = true
  3399. %       else if \lastskip > 0
  3400. %               then \@tempskipa := \lastskip
  3401. %                    \vskip - \lastskip
  3402. %                    \vskip \@tempskipa -\@outerparskip + \parskip
  3403. %            fi
  3404. %            \@endparenv
  3405. %     fi
  3406. %   END
  3407. %
  3408. % \@endparenv ==
  3409. %   BEGIN
  3410. %    \addpenalty{@endparpenalty}
  3411. %    \addvspace{\@topsepadd}
  3412. %    \endgroup    %% ends the \begin command's \begingroup
  3413. %    \par  ==  BEGIN
  3414. %                \@restorepar
  3415. %                \everypar{}
  3416. %                \par
  3417. %              END
  3418. %    \everypar == BEGIN remove \lastbox \everypar{} END
  3419. %    \begingroup  %% to match the \end commands \endgroup
  3420. %   END
  3421. %
  3422. % \item == BEGIN if  next char = [
  3423. %                  then  \@item
  3424. %                  else  @noitemarg := true
  3425. %                        \@item[@itemlabel]
  3426. %          END
  3427. %
  3428. % \@item[LAB] ==
  3429. %    BEGIN
  3430. %     if @noparitem = true
  3431. %       then @noparitem := false                        % NOTE: then clause
  3432. %                                                       % hardly every taken,
  3433. %            \box\@labels :=G \hbox{\hskip -\leftmargin % so made a macro
  3434. %                                   \box\@labels        % \@donoparitem
  3435. %                                   \hskip \leftmargin }
  3436. %            if @minipage = false then
  3437. %               \@tempskipa := \lastskip
  3438. %               \vskip -\lastskip
  3439. %               \vskip \@tempskipa + \@outerparskip - \parskip
  3440. %            fi
  3441. %       else if @inlabel = true
  3442. %              then \indent \par   % previous item empty.
  3443. %            fi
  3444. %            if hmode then 2 \unskip's  % To remove any space at end of prev.
  3445. %                     \par              % paragraph that could cause a blank
  3446. %            fi                         % line.
  3447. %            if @newlist = T
  3448. %               then if @nobreak = T   % Kludge if list follows \section
  3449. %                      then \addvspace{\@outerparskip - \parskip}
  3450. %                      else \addpenalty{\@beginparpenalty}
  3451. %                           \addvspace{\@topsep}
  3452. %                           \addvspace{-\parskip}   %% added 4 Sep 85
  3453. %                    fi
  3454. %               else \addpenalty{\@itempenalty}
  3455. %                    \addvspace{\itemsep}
  3456. %            fi
  3457. %            @inlabel :=G true
  3458. %     fi
  3459. %
  3460. %     \everypar{ @minipage :=G F
  3461. %                @newlist :=G F
  3462. %                if  @inlabel = true
  3463. %                  then @inlabel :=G false
  3464. %                       \hskip -\parindent
  3465. %                       \box\@labels
  3466. %                       \penalty 0       %% 3 Oct 85  -- allow line break here
  3467. %                       \box\@labels :=G null
  3468. %                fi
  3469. %                \everypar{} }
  3470. %     @nobreak :=G false
  3471. %     if  @noitemarg = true
  3472. %       then @noitemarg := false
  3473. %            if @nmbrlist
  3474. %              then \refstepcounter{\@listctr}
  3475. %     fi     fi
  3476. %     \@tempboxa   :=L \hbox{\makelabel{LAB}}
  3477. %     \box\@labels :=G \@labels \hskip \itemindent
  3478. %                       \hskip - (\labelwidth + \labelsep)
  3479. %                       if \wd \@tempboxa > \labelwidth
  3480. %                          then \box\@tempboxa
  3481. %                          else \hbox to \labelwidth {\makelabel{LAB}}
  3482. %                       fi
  3483. %                       \hskip\labelsep
  3484. %     \ignorespaces                        %gobble space up to text
  3485. %   END
  3486. %
  3487. %   \usecounter{CTR} == BEGIN  @nmbrlist :=L true
  3488. %                              \@listctr == CTR
  3489. %                              \setcounter{CTR}{0}
  3490. %                       END
  3491. %
  3492. % DEFINE \dimen's and \count
  3493. \newskip\topsep
  3494. \newskip\partopsep
  3495. \newskip\itemsep
  3496. \newskip\parsep
  3497. \newskip\@topsep
  3498. \newskip\@topsepadd
  3499. \newskip\@outerparskip
  3500.  
  3501. \newdimen\leftmargin
  3502. \newdimen\rightmargin
  3503. \newdimen\listparindent
  3504. \newdimen\itemindent
  3505. \newdimen\labelwidth
  3506. \newdimen\labelsep
  3507. \newdimen\linewidth
  3508. \newdimen\@totalleftmargin \@totalleftmargin=\z@
  3509. \newdimen\leftmargini
  3510. \newdimen\leftmarginii
  3511. \newdimen\leftmarginiii
  3512. \newdimen\leftmarginiv
  3513. \newdimen\leftmarginv
  3514. \newdimen\leftmarginvi
  3515.  
  3516. \newcount\@listdepth \@listdepth=0
  3517. \newcount\@itempenalty
  3518. \newcount\@beginparpenalty
  3519. \newcount\@endparpenalty
  3520.  
  3521. \newbox\@labels
  3522.  
  3523. \newif\if@inlabel \@inlabelfalse
  3524. \newif\if@newlist   \@newlistfalse
  3525. \newif\if@noparitem \@noparitemfalse
  3526. \newif\if@noparlist \@noparlistfalse
  3527. \newif\if@noitemarg \@noitemargfalse
  3528. \newif\if@nmbrlist  \@nmbrlistfalse
  3529.  
  3530. \def\list#1#2{\ifnum \@listdepth >5\relax \@toodeep
  3531.      \else \global\advance\@listdepth\@ne \fi
  3532.   \rightmargin \z@ \listparindent\z@ \itemindent\z@
  3533.   \csname @list\romannumeral\the\@listdepth\endcsname
  3534.   \def\@itemlabel{#1}\let\makelabel\@mklab \@nmbrlistfalse #2\relax
  3535.   \@trivlist
  3536.   \parskip\parsep \parindent\listparindent
  3537.   \advance\linewidth -\rightmargin \advance\linewidth -\leftmargin
  3538.   \advance\@totalleftmargin \leftmargin
  3539.   \parshape \@ne \@totalleftmargin \linewidth
  3540.   \ignorespaces}
  3541.  
  3542. \def\@trivlist{\@topsepadd\topsep
  3543.   \if@noskipsec \leavevmode \fi
  3544.   \ifvmode \advance\@topsepadd\partopsep \else \unskip\par\fi
  3545.   \if@inlabel \@noparitemtrue \@noparlisttrue
  3546.     \else \@noparlistfalse \@topsep\@topsepadd \fi
  3547.     \advance\@topsep \parskip
  3548.   \leftskip\z@\rightskip\@rightskip \parfillskip\@flushglue
  3549.   \@setpar{\if@newlist\else{\@@par}\fi}%
  3550.   \global\@newlisttrue \@outerparskip\parskip}
  3551.  
  3552. \def\trivlist{\parsep\parskip
  3553.   \@trivlist \labelwidth\z@ \leftmargin\z@
  3554.   \itemindent\z@ \def\makelabel##1{##1}}
  3555.  
  3556. \def\endlist{\global\advance\@listdepth\m@ne
  3557.     \endtrivlist}
  3558.  
  3559. % Definition of \endtrivlist moved earlier in file so other commands
  3560. % can be \let = to it.
  3561.  
  3562. \def\@mklab#1{\hfil #1}
  3563.  
  3564. \def\item{\@ifnextchar [{\@item}{\@noitemargtrue \@item[\@itemlabel]}}
  3565.  
  3566. \def\@donoparitem{\@noparitemfalse
  3567.    \global\setbox\@labels\hbox{\hskip -\leftmargin
  3568.                                \unhbox\@labels
  3569.                                 \hskip \leftmargin}\if@minipage\else
  3570.   \@tempskipa\lastskip
  3571.   \vskip -\lastskip \advance\@tempskipa\@outerparskip
  3572.   \advance\@tempskipa -\parskip \vskip\@tempskipa\fi}
  3573.  
  3574. \def\@item[#1]{\if@noparitem \@donoparitem
  3575.   \else \if@inlabel \indent \par \fi
  3576.          \ifhmode \unskip\unskip \par \fi
  3577.          \if@newlist \if@nobreak \@nbitem \else
  3578.                         \addpenalty\@beginparpenalty
  3579.                         \addvspace\@topsep \addvspace{-\parskip}\fi
  3580.            \else \addpenalty\@itempenalty \addvspace\itemsep
  3581.           \fi
  3582.     \global\@inlabeltrue
  3583. \fi
  3584. \everypar{\global\@minipagefalse\global\@newlistfalse
  3585.           \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels
  3586.              \penalty\z@ \fi
  3587.           \everypar{}}\global\@nobreakfalse
  3588. \if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi
  3589. \setbox\@tempboxa\hbox{\makelabel{#1}}%
  3590. \global\setbox\@labels
  3591.  \hbox{\unhbox\@labels \hskip \itemindent
  3592.        \hskip -\labelwidth \hskip -\labelsep
  3593.        \ifdim \wd\@tempboxa >\labelwidth
  3594.                 \box\@tempboxa
  3595.           \else \hbox to\labelwidth {\makelabel{#1}}\fi
  3596.        \hskip \labelsep}\ignorespaces}
  3597.  
  3598. \def\@nbitem{\@tempskipa\@outerparskip \advance\@tempskipa -\parskip
  3599.               \addvspace{\@tempskipa}}
  3600.  
  3601. \def\usecounter#1{\@nmbrlisttrue\def\@listctr{#1}\setcounter{#1}\z@}
  3602.  
  3603.  \message{itemize,}
  3604. %      ****************************************
  3605. %      *        ITEMIZE AND ENUMERATE         *
  3606. %      ****************************************
  3607. %
  3608. %  Enumeration is done with four counters: enumi, enumii, enumiii
  3609. %  and enumiv, where enumN controls the numbering of the Nth level
  3610. %  enumeration.  The label is generated by the commands
  3611. %  \labelenumi ... \labelenumiv, which should be defined by the
  3612. %  document style.  Note that \p@enumN\theenumN defines the output
  3613. %  of a \ref command.  A typical definition might be:
  3614. %     \def\theenumii{\alph{enumii}}
  3615. %     \def\p@enumii{\theenumi\theenumii}
  3616. %     \def\labelenumii{(\theenumii)}
  3617. % which will print the labels as '(a)', '(b)', ... and print a \ref as
  3618. % '3a'.
  3619. %
  3620. % The item numbers are moved to the right of the label box, so they are
  3621. % always a distance of \labelsep from the item.
  3622. %
  3623. % \@enumdepth holds the current enumeration nesting depth.
  3624. %
  3625. % Itemization is controlled by four commands: \labelitemi, \labelitemii,
  3626. % \labelitemiii, and \labelitemiv.  To cause the second-level list to be
  3627. % bulleted, you just define \labelitemii to be $\bullet$.  \@itemspacing
  3628. % and \@itemdepth are the analogs of \@enumspacing and \@enumdepth.
  3629. %
  3630. % \enumerate ==
  3631. %   BEGIN
  3632. %     if \@enumdepth > 3
  3633. %       then errormessage: ``Too deeply nested''.
  3634. %       else \@enumdepth :=L \@enumdepth + 1
  3635. %            \@enumctr :=L eval(enum@\romannumeral\the\@enumdepth)
  3636. %            \list{\label(\@enumctr)}
  3637. %                 {\usecounter{\@enumctr}
  3638. %                  \makelabel{LABEL} ==  \hss \llap{LABEL}}
  3639. %     fi
  3640. %   END
  3641. %
  3642. % \endenumerate == \endlist
  3643. %
  3644. \newcount\@enumdepth \@enumdepth = 0
  3645.  
  3646. \@definecounter{enumi}
  3647. \@definecounter{enumii}
  3648. \@definecounter{enumiii}
  3649. \@definecounter{enumiv}
  3650.  
  3651. \def\enumerate{\ifnum \@enumdepth >3 \@toodeep\else
  3652.       \advance\@enumdepth \@ne
  3653.       \edef\@enumctr{enum\romannumeral\the\@enumdepth}\list
  3654.       {\csname label\@enumctr\endcsname}{\usecounter
  3655.         {\@enumctr}\def\makelabel##1{\hss\llap{##1}}}\fi}
  3656.  
  3657. \let\endenumerate =\endlist
  3658.  
  3659.  
  3660. %  \itemize ==
  3661. %    BEGIN
  3662. %      if \@itemdepth > 3
  3663. %        then  errormessage: 'Too deeply nested'.
  3664. %        else  \@itemdepth :=L \@itemdepth + 1
  3665. %              \@itemitem  == eval(labelitem\romannumeral\the\@itemdepth)
  3666. %              \list{\@nameuse{\@itemitem}}
  3667. %                   {\makelabel{LABEL} ==  \hss \llap{LABEL}}
  3668. %      fi
  3669. %    END
  3670. %
  3671. %  \enditemize ==  \endlist
  3672. %
  3673. \newcount\@itemdepth \@itemdepth = 0
  3674.  
  3675. \def\itemize{\ifnum \@itemdepth >3 \@toodeep\else \advance\@itemdepth \@ne
  3676. \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
  3677. \list{\csname\@itemitem\endcsname}{\def\makelabel##1{\hss\llap{##1}}}\fi}
  3678.  
  3679. \let\enditemize =\endlist
  3680.  
  3681.  \message{boxes,}
  3682. %       *********************************************
  3683. %       *                 BOXES                     *
  3684. %       *********************************************
  3685. %
  3686. %  USER COMMANDS:
  3687. %
  3688. %  \makebox [WID][POS]{OBJ}
  3689. %          : puts OBJ in an \hbox of width WID, positioned by POS.
  3690. %            POS = l -> flushleft, POS = r -> flushright.
  3691. %            Default is centered.
  3692. %            If WID is missing, then POS is also missing and OBJ
  3693. %            is put in an \hbox of its natural width.
  3694. %
  3695. %  \mbox{OBJ} == \makebox{OBJ}, and is more efficient.
  3696. %
  3697. %  \makebox (X,Y)[POS]{OBJ}
  3698. %          : puts OBJ in an \hbox of width X * \unitlength
  3699. %            and height Y * \unitlength.  POS arguments are
  3700. %            l or r for flushleft, flushright and  t or b
  3701. %            for top, bottom -- or combinations like  tr or rb.
  3702. %            Default for horizontal and vertical are centered.
  3703. %
  3704. %  \newsavebox{\CMD} : If \CMD is undefined, then defines it
  3705. %           to be a TeX box register.
  3706. %
  3707. %  \savebox {\CMD} ... : \CMD is defined to be a TeX box register,
  3708. %            and the '...' are any \makebox arguments.  It is
  3709. %            like \makebox, except it doesn't produce text but
  3710. %            saves the value in \box \CMD.
  3711. %            \sbox N{OBJ} is an efficient abbreviation for
  3712. %            \savebox N{OBJ}.
  3713. %
  3714. %  \framebox ...  : like \makebox, except it puts a 'frame' around
  3715. %            the box.  The frame is made of lines of thickness
  3716. %            \framerule, separated by space \framesep from the
  3717. %            text -- except for \framebox(X,Y) ... , where the
  3718. %            thickness of the lines is as for the picture environment,
  3719. %            and there is no separation added.
  3720. %            \fbox{OBJ} is an efficient abbreviation for \framebox{OBJ}
  3721. %
  3722. %  \parbox[POS]{WIDTH}{TEXT} : Makes a box with \hsize TEXT, positioned
  3723. %         by POS as follows:
  3724. %              c : \vcenter (placed in $...$ if not in math mode)
  3725. %              b : \vbox
  3726. %              t : \vtop
  3727. %         default value is c.
  3728. %    Sets \hsize := WIDTH and calls \@parboxrestore, which does
  3729. %    the following:
  3730. %         Restores the original definitions of:
  3731. %              \par
  3732. %              \\
  3733. %              \- \' \` \=
  3734. %         Resets the following parameters:
  3735. %              \parindent        = 0pt
  3736. %              \parskip          = 0pt           %% added 20 Jan 87
  3737. %              \linewidth        = \hsize
  3738. %              \@totalleftmargin = 0pt
  3739. %              \leftskip         = 0pt
  3740. %              \rightskip        = 0pt
  3741. %              \@rightskip       = 0pt
  3742. %              \parfillskip      = 0pt plus 1fil
  3743. %              \lineskip         = \normallineskip
  3744. %              \baselineskip     = \normalbaselineskip
  3745. %         Calls \sloppy
  3746. %
  3747. %  Note: \@arrayparboxrestore same as \@parboxrestore
  3748. %         but it doesn't restore \\.
  3749. %
  3750. % \minipage  :  Similar to parbox, except it also
  3751. %        makes this look like a page by setting
  3752. %              \textwidth == \columnwidth == box width
  3753. %        changes footnotes by redefining:
  3754. %              \@mpfn         == mpfootnote
  3755. %              \thempfn       == \thempfootnote
  3756. %              \@footnotetext == \@mpfootnotetext
  3757. %        resets the following list environment parameters
  3758. %              \@listdepth    == \@mplistdepth
  3759. %        where  \@mplistdepth is initialized to zero,
  3760. %        and executes \@minipagerestore to allow the document
  3761. %        style to reset any other parameters it desires.
  3762. %        It sets @minipage := T, and resets \everypar to set
  3763. %        it false.  This switch keeps \addvspace from putting space
  3764. %        at the top of a minipage.
  3765. %
  3766. %        Change added 24 May 89: \minipage sets @minipage globally;
  3767. %        \endminipage resets it false.
  3768. %
  3769. %
  3770. % \rule [RAISED]{WIDTH}{HEIGHT} : Makes a WIDTH X HEIGHT rule, raised
  3771. %        RAISED.
  3772. %
  3773. % \underline {TEXT} : Makes an underlined hbox with TEXT in it.
  3774. %
  3775. % \raisebox{DISTANCE}[HEIGHT][DEPTH]{BOX} : Raises BOX up by DISTANCE
  3776. %        length (down if DISTANCE negative).  Makes TeX think that
  3777. %        the new box extends HEIGHT above the line and DEPTH below, for
  3778. %        a total vertical length of HEIGHT+DEPTH.  Default values of
  3779. %        HEIGHT & DEPTH = actual height and depth of box in new position.
  3780. %
  3781. % \makebox ==
  3782. %  BEGIN
  3783. %    if next char = (
  3784. %      then  \@makepicbox
  3785. %      else  if  next char = [
  3786. %              then  \@makebox
  3787. %              else  \mbox     fi
  3788. %    fi
  3789. %  END
  3790. %
  3791. % \@makebox[LEN] ==
  3792. % BEGIN
  3793. %   leave vertical mode
  3794. %   if next char '[' then \@imakebox[LEN]
  3795. %                    else \@imakebox[LEN][x]  fi
  3796. % END
  3797. %
  3798. % \@imakebox[LEN][POS]{OBJ} ==
  3799. %  BEGIN
  3800. %    \hbox to LEN
  3801. %      { \mb@l :=L \mb@r :=L \hss
  3802. %        \let\mb@POS = \relax
  3803. %       \mb@l OBJ \mb@r }
  3804. %  END
  3805. %
  3806. % \@makepicbox(X,Y) ==
  3807. %  BEGIN
  3808. %    leave vertical mode
  3809. %    if next char = [  then  \@imakepicbox(X,Y)
  3810. %                      else  \@imakepicbox(X,Y)[]  fi
  3811. %  END
  3812. %
  3813. % \@imakepicbox(X,Y)[POS]{OBJ} ==
  3814. %  BEGIN
  3815. %    \vbox to Y * \unitlength
  3816. %       { \mb@l :=L \mb@r :=L \hss
  3817. %         \mb@t :=L \mb@b :=L \hss
  3818. %         tfor \@tempa := POS    % one iteration for each token in POS
  3819. %           do  \mb@eval(\@tempa) :=L null od
  3820. %         \mb@t
  3821. %         \hbox to X * \unitlength
  3822. %           {\mb@l OBJ \mb@r }
  3823. %        \mb@b}
  3824. %  END
  3825. %
  3826.  
  3827. \def\makebox{\@ifnextchar ({\@makepicbox}{\@ifnextchar
  3828.      [{\@makebox}{\mbox}}}
  3829.  
  3830. \def\mbox#1{\leavevmode\hbox{#1}}
  3831.  
  3832. \def\@makebox[#1]{\leavevmode\@ifnextchar [{\@imakebox[#1]}{\@imakebox[#1][x]}}
  3833.  
  3834. \long\def\@imakebox[#1][#2]#3{\hbox to#1{\let\mb@l\hss
  3835. \let\mb@r\hss \expandafter\let\csname mb@#2\endcsname\relax
  3836. \mb@l #3\mb@r}}
  3837.  
  3838. \def\@makepicbox(#1,#2){\leavevmode\@ifnextchar
  3839.    [{\@imakepicbox(#1,#2)}{\@imakepicbox(#1,#2)[]}}
  3840.  
  3841. \long\def\@imakepicbox(#1,#2)[#3]#4{\vbox to#2\unitlength
  3842.    {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss
  3843.     \let\mb@t\vss
  3844.     \@tfor\@tempa :=#3\do{\expandafter\let
  3845.         \csname mb@\@tempa\endcsname\relax}%
  3846. \mb@t\hbox to #1\unitlength{\mb@l #4\mb@r}\mb@b}}
  3847.  
  3848. \def\newsavebox#1{\@ifdefinable#1{\newbox#1}}
  3849.  
  3850. \def\savebox#1{\@ifnextchar ({\@savepicbox#1}{\@ifnextchar
  3851.      [{\@savebox#1}{\sbox#1}}}
  3852.  
  3853. \def\sbox#1#2{\setbox#1\hbox{#2}}
  3854.  
  3855. \def\@savebox#1[#2]{\@ifnextchar [{\@isavebox#1[#2]}{\@isavebox#1[#2][x]}}
  3856.  
  3857. \long\def\@isavebox#1[#2][#3]#4{\setbox#1 \hbox{\@imakebox[#2][#3]{#4}}}
  3858.  
  3859. \def\@savepicbox#1(#2,#3){\@ifnextchar
  3860.    [{\@isavepicbox#1(#2,#3)}{\@isavepicbox#1(#2,#3)[]}}
  3861.  
  3862. \long\def\@isavepicbox#1(#2,#3)[#4]#5{\setbox#1 \hbox{\@imakepicbox
  3863.      (#2,#3)[#4]{#5}}}
  3864.  
  3865. \def\usebox#1{\leavevmode\copy #1\relax}
  3866.  
  3867. %% The following definition of \frame was written by Pavel Curtis
  3868. %% (Extra space removed 14 Jan 88)
  3869. \long\def\frame#1{\leavevmode
  3870.     \hbox{\hskip-\@wholewidth
  3871.      \vbox{\vskip-\@wholewidth
  3872.             \hrule \@height\@wholewidth
  3873.           \hbox{\vrule \@width\@wholewidth #1\vrule \@width\@wholewidth}\hrule
  3874.            \@height \@wholewidth\vskip -\@halfwidth}\hskip-\@wholewidth}}
  3875.  
  3876. \newdimen\fboxrule
  3877. \newdimen\fboxsep
  3878.  
  3879. \long\def\fbox#1{\leavevmode\setbox\@tempboxa\hbox{#1}\@tempdima\fboxrule
  3880.     \advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa
  3881.    \hbox{\lower \@tempdima\hbox
  3882.   {\vbox{\hrule \@height \fboxrule
  3883.           \hbox{\vrule \@width \fboxrule \hskip\fboxsep
  3884.           \vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip
  3885.                  \fboxsep\vrule \@width \fboxrule}
  3886.                  \hrule \@height \fboxrule}}}}
  3887.  
  3888. \def\framebox{\@ifnextchar ({\@framepicbox}{\@ifnextchar
  3889.      [{\@framebox}{\fbox}}}
  3890.  
  3891. \def\@framebox[#1]{\@ifnextchar [{\@iframebox[#1]}{\@iframebox[#1][x]}}
  3892.  
  3893. \long\def\@iframebox[#1][#2]#3{\leavevmode
  3894.   \savebox\@tempboxa[#1][#2]{\kern\fboxsep #3\kern\fboxsep}\@tempdima\fboxrule
  3895.     \advance\@tempdima \fboxsep \advance\@tempdima \dp\@tempboxa
  3896.    \hbox{\lower \@tempdima\hbox
  3897.   {\vbox{\hrule \@height \fboxrule
  3898.           \hbox{\vrule \@width \fboxrule \hskip-\fboxrule
  3899.               \vbox{\vskip\fboxsep \box\@tempboxa\vskip\fboxsep}\hskip
  3900.                   -\fboxrule\vrule \@width \fboxrule}
  3901.                   \hrule \@height \fboxrule}}}}
  3902.  
  3903. \def\@framepicbox(#1,#2){\@ifnextchar
  3904.    [{\@iframepicbox(#1,#2)}{\@iframepicbox(#1,#2)[]}}
  3905.  
  3906. \long\def\@iframepicbox(#1,#2)[#3]#4{\frame{\@imakepicbox(#1,#2)[#3]{#4}}}
  3907.  
  3908. \def\parbox{\@ifnextchar [{\@iparbox}{\@iparbox[c]}}
  3909.  
  3910. \long\def\@iparbox[#1]#2#3{\leavevmode \@pboxswfalse
  3911.    \if #1b\vbox
  3912.      \else \if #1t\vtop
  3913.               \else \ifmmode \vcenter
  3914.                         \else \@pboxswtrue $\vcenter
  3915.                      \fi
  3916.            \fi
  3917.     \fi{\hsize #2\@parboxrestore #3}\if@pboxsw $\fi}
  3918.  
  3919. \let\@dischyph=\-
  3920. \let\@acci=\'
  3921. \let\@accii=\`
  3922. \let\@acciii=\=
  3923.  
  3924.  
  3925. \def\@arrayparboxrestore{\let\par\@@par
  3926.     \let\-\@dischyph
  3927.     \let\'\@acci \let\`\@accii \let\=\@acciii
  3928.     \parindent\z@ \parskip\z@
  3929.     \everypar{}\linewidth\hsize
  3930.     \@totalleftmargin\z@ \leftskip\z@ \rightskip\z@ \@rightskip\z@
  3931.     \parfillskip\@flushglue \lineskip\normallineskip
  3932.     \baselineskip\normalbaselineskip\sloppy}
  3933.  
  3934. \def\@parboxrestore{\@arrayparboxrestore\let\\=\@normalcr}
  3935.  
  3936. \newif\if@minipage \@minipagefalse
  3937.  
  3938. \def\minipage{\@ifnextchar [{\@iminipage}{\@iminipage[c]}}
  3939.  
  3940. \def\@iminipage[#1]#2{\leavevmode \@pboxswfalse
  3941.    \if #1b\vbox
  3942.      \else \if #1t\vtop
  3943.               \else \ifmmode \vcenter
  3944.                         \else \@pboxswtrue $\vcenter
  3945.                      \fi
  3946.            \fi
  3947.     \fi\bgroup
  3948.     \hsize #2\textwidth\hsize \columnwidth\hsize
  3949.     \@parboxrestore
  3950.     \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@
  3951.     \let\@footnotetext\@mpfootnotetext
  3952.     \let\@listdepth\@mplistdepth \@mplistdepth\z@
  3953.     \@minipagerestore\global\@minipagetrue %% \global added 24 May 89
  3954.     \everypar{\global\@minipagefalse\everypar{}}}
  3955.  
  3956.  
  3957. \let\@minipagerestore=\relax
  3958.  
  3959. \def\endminipage{\par\vskip-\lastskip
  3960. \ifvoid\@mpfootins\else
  3961. \vskip\skip\@mpfootins\footnoterule\unvbox\@mpfootins\fi
  3962. \global\@minipagefalse   %% added 24 May 89
  3963. \egroup\if@pboxsw $\fi}
  3964.  
  3965. \newcount\@mplistdepth
  3966. \newinsert\@mpfootins
  3967.  
  3968. \long\def\@mpfootnotetext#1{\global\setbox\@mpfootins
  3969.     \vbox{\unvbox\@mpfootins
  3970.     \footnotesize
  3971.     \hsize\columnwidth \@parboxrestore
  3972.    \edef\@currentlabel{\csname p@mpfootnote\endcsname\@thefnmark}\@makefntext
  3973.      {\rule{\z@}{\footnotesep}\ignorespaces #1\strut}}}
  3974.      % \strut added 27 Mar 89, on suggestion by Don Hosek
  3975.  
  3976. \newif\if@pboxsw
  3977.  
  3978. \def\rule{\@ifnextchar[{\@rule}{\@rule[\z@]}}
  3979.  
  3980. \def\@rule[#1]#2#3{\@tempdima#3\advance\@tempdima #1\leavevmode\hbox{\vrule
  3981.   \@width#2 \@height\@tempdima \@depth-#1}}
  3982.  
  3983. \let\@@underline\underline
  3984. \def\underline#1{\relax\ifmmode
  3985.   \@@underline{#1}\else $\@@underline{\hbox{#1}}$\relax\fi}
  3986.  
  3987. \def\raisebox#1{\@ifnextchar[{\@argrsbox{#1}}{\@rsbox{#1}}}
  3988.  
  3989. \def\@argrsbox#1[#2]{%
  3990. \@ifnextchar[{\@iirsbox{#1}[#2]}{\@irsbox{#1}[#2]}}
  3991.  
  3992. \long\def\@rsbox#1#2{\leavevmode\hbox{\raise #1\hbox{#2}}}
  3993.  
  3994. \long\def\@irsbox#1[#2]#3{\setbox\@tempboxa \hbox
  3995.    {\raise #1\hbox{#3}}\ht\@tempboxa#2\leavevmode\box\@tempboxa}
  3996.  
  3997. \long\def\@iirsbox#1[#2][#3]#4{\setbox\@tempboxa \hbox
  3998.    {\raise #1\hbox{#4}}\ht\@tempboxa#2\dp\@tempboxa#3\leavevmode\box\@tempboxa}
  3999.  
  4000.  
  4001.  \message{tabbing,}
  4002. %       ****************************************
  4003. %       *       THE TABBING ENVIRONMENT        *
  4004. %       ****************************************
  4005. %
  4006. %  \dimen(\@firsttab + i) = distance of tab stop i from left margin
  4007. %         0 <= i <= 15 (?).
  4008. %
  4009. %  \dimen\@firsttab is initialized to \@totalleftmargin, so it starts
  4010. %      at the prevailing left margin.
  4011. %
  4012. %  \@maxtab          = number of highest defined tab register
  4013. %                       probably = \@firsttab + 12
  4014. %  \@nxttabmar = tab stop number of next line's left margin
  4015. %  \@curtabmar = tab stop number of current line's left margin
  4016. %  \@curtab    = number of the current tab. At start of line,
  4017. %                      it equals \@curtabmar
  4018. %  \@hightab   = largest tab number currently defined.
  4019. %  \@tabpush   = depth of \pushtab's
  4020. %
  4021. %  \box\@curline     = contents of current line, excluding left margin skip,
  4022. %                      and excluding contents of current field
  4023. %  \box\@curfield    = contents of current field
  4024. %
  4025. %  @rjfield          = switch: T iff the last field of the line should be
  4026. %                      right-justified at the right margin.
  4027. %
  4028. %  \tabbingsep          = distance left by the \' command between the current
  4029. %                      position and the field that is ``left-shifted''.
  4030. %
  4031. %  UTILITY MACROS
  4032. %   \@stopfield  : closes the current field
  4033. %   \@addfield   : adds the current field to the current line.
  4034. %   \@contfield  : continues the current field
  4035. %   \@startfield : begins the next field
  4036. %   \@stopline   : closes the current line and outputs it
  4037. %   \@startline  : starts the next line
  4038. %   \@ifatmargin : an \if that is true iff the current line.
  4039. %                  has width zero
  4040. %
  4041. % \@startline ==
  4042. %  BEGIN
  4043. %   \@curtabmar :=G \@nxttabmar
  4044. %   \@curtab :=G \@curtabmar
  4045. %   \box\@curline :=G null
  4046. %   \@startfield
  4047. %   \strut
  4048. %  END
  4049. %
  4050. % \@stopline ==
  4051. %  BEGIN
  4052. %   \unskip
  4053. %   \@stopfield
  4054. %   if @rjfield = T
  4055. %     then  @rjfield :=G F
  4056. %           \@tempdima := \@totalleftmargin + \linewidth
  4057. %           \hbox to \@tempdima{\@itemfudge
  4058. %                               \hskip \dimen\@curtabmar
  4059. %                               \box\@curline
  4060. %                               \hfil
  4061. %                               \box\@curfield}
  4062. %     else \@addfield
  4063. %          \hbox {\@itemfudge
  4064. %                 \hskip \dimen\@curtabmar
  4065. %                 \box\@curline}
  4066. %   fi
  4067. %  END
  4068. %
  4069. % \@startfield ==
  4070. %  BEGIN
  4071. %    \box\@curfield :=G \hbox {
  4072. %  END
  4073. %
  4074. % \@stopfield ==
  4075. %  BEGIN
  4076. %     }
  4077. %  END
  4078. %
  4079. % \@contfield ==
  4080. %  BEGIN
  4081. %   \box\@curfield :=G \hbox { \unhbox\@currfield  %%} brace matching
  4082. %  END
  4083. % \@addfield ==
  4084. %  BEGIN
  4085. %   \box\@curline :=G \unbox\@curline * \unbox\@curfield
  4086. %  END
  4087. %
  4088. % \@ifatmargin ==
  4089. %  BEGIN
  4090. %   if  dim of box\@curline = 0pt  then
  4091. %  END
  4092. %
  4093. %
  4094. % \tabbing ==
  4095. %  BEGIN
  4096. %   \lineskip :=L 0pt
  4097. %   \> == \@rtab
  4098. %   \< == \@ltab
  4099. %   \= == \@settab
  4100. %   \+ == \@tabplus
  4101. %   \- == \@tabminus
  4102. %   \` == \@tabrj
  4103. %   \' == \@tablab
  4104. %   \\ == BEGIN \@stopline \@startline END
  4105. %   \\[DIST] == BEGIN \@stopline \vskip DIST \@startline\ignorespaces END
  4106. %   \\* == BEGIN \@stopline \penalty 10000 \@startline END
  4107. %   \\*[DIST] == BEGIN \@stopline \penalty 10000 \vskip DIST
  4108. %                      \@startline\ignorespaces               END
  4109. %   \@hightab :=G \@nxttabmar :=G \@firsttab
  4110. %   \@tabpush :=G 0
  4111. %   \dimen\@firsttab := \@totalleftmargin
  4112. %   @rjfield :=G F
  4113. %   \trivlist  \item[]
  4114. %   if @minipage = F then \vskip \parskip fi
  4115. %   \box\@tabfbox = \rlap{\indent\the\everypar}  % note: \the\everypar sets
  4116. %   \@itemfudge == BEGIN \box\@tabfbox END       %       @inlabel :=G F
  4117. %   \@startline
  4118. %   \ignorespaces
  4119. %  END
  4120. %
  4121. % \@endtabbing ==
  4122. %  BEGIN
  4123. %   \@stopline
  4124. %   if \@tabpush > 0 then error message: ''unmatched \poptabs'' fi
  4125. %   \endtrivlist
  4126. %  END
  4127. %
  4128. % \@rtab ==
  4129. %  BEGIN
  4130. %   \@stopfield
  4131. %   \@addfield
  4132. %   if \@curtab < \@hightab
  4133. %     then \@curtab :=G \@curtab + 1
  4134. %     else error message ``Undefined Tab''   fi
  4135. %   \@tempdima := \dimen\@curtab - \dimen\@curtabmar
  4136. %                        - width of box \@curline
  4137. %   \box\@curline :=G \hbox{\unhbox\@curline + \hskip\@tempdima}
  4138. %   \@startfield
  4139. %  END
  4140. %
  4141. % \@settab ==
  4142. %  BEGIN
  4143. %   \@stopfield
  4144. %   \@addfield
  4145. %   if \@curtab < \@maxtab
  4146. %     then \@curtab :=G \@curtab+1
  4147. %     else error message: ``Too many tabs''    fi
  4148. %   if \@curtab > \@hightab
  4149. %     then \@hightab :=L \@curtab    fi
  4150. %   \dimen\@curtab :=L \dimen\@curtabmar + width of \box\@curline
  4151. %   \@startfield
  4152. %  END
  4153. %
  4154. % \@ltab ==
  4155. %  BEGIN
  4156. %   \@ifatmargin
  4157. %     then if \@curtabmar > \@firsttab
  4158. %            then \@curtab :=G \@curtab - 1
  4159. %                 \@curtabmar :=G \@curtabmar - 1
  4160. %            else error message ``Too many untabs''      fi
  4161. %     else error message ``Left tab in middle of line''
  4162. %   fi
  4163. %  END
  4164. %
  4165. % \@tabplus ==
  4166. %  BEGIN
  4167. %        if  \@nxttabmar < \@hightab
  4168. %           then \@nxttabmar :=G \@nxttabmar+1
  4169. %           else error message ``Undefined tab''
  4170. %        fi
  4171. %  END
  4172. %
  4173. % \@tabminus ==
  4174. %  BEGIN
  4175. %        if \@nxttabmar > \@firsttab
  4176. %           then \@nxttabmar :=G \@nxttabmar-1
  4177. %           else error message ``Too many untabs''
  4178. %        fi
  4179. %  END
  4180. %
  4181. % \@tabrj ==
  4182. %  BEGIN \@stopfield
  4183. %        \@addfield
  4184. %        @rjfield :=G T
  4185. %        \@startfield
  4186. %  END
  4187. %
  4188. % \@tablab ==
  4189. %  BEGIN \@stopfield
  4190. %        \box\@curline G:= \hbox{ \box\@curline %% `G' added 17 Jun 86
  4191. %                                \hskip - width of \box\@curfield
  4192. %                                \hskip -\tabbingsep
  4193. %                                \box\@curfield
  4194. %                                \hskip \tabbingsep }
  4195. %        \@startfield
  4196. %  END
  4197. %
  4198. % \pushtabs ==
  4199. %   BEGIN
  4200. %     \@stopfield
  4201. %     \@tabpush :=G \@tabpush + 1
  4202. %     \begingroup
  4203. %     \@contfield
  4204. %   END
  4205. %
  4206. % \poptabs ==
  4207. %  BEGIN
  4208. %    \@stopfield
  4209. %    if \@tabpush > 0
  4210. %      then \endgroup
  4211. %           \@tabpush :=G \@tabpush - 1
  4212. %      else error message: ``Too many \poptabs''
  4213. %    fi
  4214. %    \@contfield
  4215. %  END
  4216. %
  4217. % The accents \` , \' , and \= that have been redefined inside a tabbing
  4218. % environment can be called by typing \a` , \a' , and \a=.
  4219. %
  4220.  
  4221. \expandafter \let \csname a`\endcsname = \`
  4222. \expandafter \let \csname a'\endcsname = \'
  4223. \expandafter \let \csname a=\endcsname = \=
  4224. \def\a#1{\csname a#1\endcsname}
  4225.  
  4226. \newif\if@rjfield
  4227. \newcount\@firsttab
  4228. \newcount\@maxtab
  4229. \newdimen\@gtempa \@firsttab=\allocationnumber
  4230. \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
  4231. \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
  4232. \newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa
  4233. \newdimen\@getempa \@maxtab=\allocationnumber
  4234. \dimen\@firsttab=0pt
  4235. \newcount\@nxttabmar
  4236. \newcount\@curtabmar
  4237. \newcount\@curtab
  4238. \newcount\@hightab
  4239. \newcount\@tabpush
  4240. \newbox\@curline
  4241. \newbox\@curfield
  4242. \newbox\@tabfbox
  4243.  
  4244. \def\@startline{\global\@curtabmar\@nxttabmar\relax
  4245.    \global\@curtab\@curtabmar\global\setbox\@curline\hbox % missing \global
  4246.     {}\@startfield\strut}                                 % added 17 Jun 86
  4247.  
  4248. \def\@stopline{\unskip\@stopfield\if@rjfield \global\@rjfieldfalse
  4249.    \@tempdima\@totalleftmargin \advance\@tempdima\linewidth
  4250. \hbox to\@tempdima{\@itemfudge\hskip\dimen\@curtabmar
  4251.    \box\@curline\hfil\box\@curfield}\else\@addfield
  4252.    \hbox{\@itemfudge\hskip\dimen\@curtabmar\box\@curline}\fi}
  4253.  
  4254. \def\@startfield{\global\setbox\@curfield\hbox\bgroup}%{ BRACE MATCH HACK
  4255. \let\@stopfield=}
  4256. \def\@contfield{\global\setbox\@curfield\hbox\bgroup\unhbox\@curfield}
  4257. \def\@addfield{\global\setbox\@curline\hbox{\unhbox
  4258.      \@curline\unhbox\@curfield}}
  4259. \def\@ifatmargin{\ifdim \wd\@curline =\z@}
  4260.  
  4261. \def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}{\@xtabcr}}
  4262.  
  4263. \def\@xtabcr{\@ifnextchar[{\@itabcr}{\@startline\ignorespaces}}
  4264.  
  4265. \def\@itabcr[#1]{\vskip #1\@startline\ignorespaces}
  4266.  
  4267. \def\kill{\@stopfield\@startline\ignorespaces}
  4268.  
  4269. % REMOVE \outer FROM PLAIN'S DEF OF \+
  4270.  
  4271. \def\+{\tabalign}
  4272.  
  4273.  
  4274. \def\tabbing{\lineskip \z@\let\>\@rtab\let\<\@ltab\let\=\@settab
  4275.      \let\+\@tabplus\let\-\@tabminus\let\`\@tabrj\let\'\@tablab
  4276.      \let\\=\@tabcr
  4277.      \global\@hightab\@firsttab
  4278.      \global\@nxttabmar\@firsttab
  4279.      \dimen\@firsttab\@totalleftmargin
  4280.      \global\@tabpush0 \global\@rjfieldfalse
  4281.      \trivlist \item[]\if@minipage\else\vskip\parskip\fi
  4282.      \setbox\@tabfbox\hbox{\rlap{\indent\hskip\@totalleftmargin
  4283.        \the\everypar}}\def\@itemfudge{\box\@tabfbox}\@startline\ignorespaces}
  4284.  
  4285. \def\endtabbing{\@stopline\ifnum\@tabpush > 0 \@badpoptabs \fi\endtrivlist}
  4286.  
  4287. \def\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab
  4288.       \global\advance\@curtab \@ne \else\@badtab\fi
  4289.       \@tempdima\dimen\@curtab
  4290.       \advance\@tempdima -\dimen\@curtabmar
  4291.       \advance\@tempdima -\wd\@curline
  4292.       \global\setbox\@curline\hbox{\unhbox\@curline\hskip\@tempdima}%
  4293.       \@startfield\ignorespaces}
  4294. % Omitted \global added to \@rtab 17 Jun 86
  4295.  
  4296. \def\@settab{\@stopfield\@addfield\ifnum \@curtab < \@maxtab
  4297.       \global\advance\@curtab \@ne \else\@latexerr{Tab overflow}\@ehd\fi
  4298.       \ifnum\@curtab > \@hightab
  4299.       \@hightab\@curtab\fi
  4300.       \dimen\@curtab\dimen\@curtabmar
  4301.       \advance\dimen\@curtab \wd\@curline\@startfield\ignorespaces}
  4302. \def\@ltab{\@ifatmargin\ifnum\@curtabmar > \@firsttab
  4303.       \global\advance\@curtab \m@ne \global\advance\@curtabmar \m@ne \else
  4304.       \@badtab\fi\else
  4305.       \@latexerr{\string\<\space in mid line}\@ehd\fi\ignorespaces}
  4306. \def\@tabplus {\ifnum \@nxttabmar < \@hightab
  4307.       \global\advance\@nxttabmar \@ne \else
  4308.       \@badtab\fi\ignorespaces}
  4309. \def\@tabminus{\ifnum\@nxttabmar > \@firsttab
  4310.       \global\advance\@nxttabmar \m@ne \else
  4311.       \@badtab\fi\ignorespaces}
  4312. \def\@tabrj{\@stopfield\@addfield\global\@rjfieldtrue\@startfield\ignorespaces}
  4313.  
  4314. \def\@tablab{\@stopfield\global\setbox\@curline\hbox{\box\@curline
  4315.      \hskip -\wd\@curfield \hskip -\tabbingsep \box\@curfield
  4316.       \hskip \tabbingsep}\@startfield\ignorespaces}
  4317. % \setbox\@curline made \global in \@tablab. 17 Jun 86
  4318.  
  4319. \def\pushtabs{\@stopfield\@addfield\global\advance\@tabpush \@ne \begingroup
  4320.        \@contfield}
  4321. \def\poptabs{\@stopfield\@addfield\ifnum\@tabpush > \z@ \endgroup
  4322.      \global\advance\@tabpush \m@ne \else
  4323.      \@badpoptabs\fi\@contfield}
  4324.  
  4325. \newdimen\tabbingsep
  4326.  
  4327.  \message{array,}
  4328. %      ****************************************
  4329. %      *    ARRAY AND TABULAR ENVIRONMENTS    *
  4330. %      ****************************************
  4331. %
  4332. % ARRAY PARMETERS:
  4333. %  \arraycolsep    : half the width separating columns in an array environment
  4334. %  \tabcolsep      : half the width separating columns in a tabular environment
  4335. %  \arrayrulewidth : width of rules
  4336. %  \doublerulesep  : space between adjacent rules in array or tabular
  4337. %  \arraystretch   : line spacing in array and tabular environments is done by
  4338. %                    placing a strut in every row of height and depth
  4339. %                    \arraystretch times the height and depth of the strut
  4340. %                    produced by an ordinary \strut commmand.
  4341. %
  4342. % PREAMBLE:
  4343. %  The PREAMBLE argument of an array or tabular environment can contain
  4344. %  the following:
  4345. %    l,r,c  : indicate where entry is to be placed.
  4346. %    |      : for vertical rule
  4347. %    @{EXP} : inserts the text EXP in every column.  \arraycolsep or \tabcolsep
  4348. %             spacing is suppressed.
  4349. %    *{N}{PRE} : equivalent to writing N copies of PRE in the preamble.  PRE
  4350. %                may contain *{N'}{EXP'} expressions.
  4351. %    p{LEN} : makes entry in parbox of width LEN.
  4352. %
  4353. % SPECIAL ARRAY COMMANDS:
  4354. %   \multicolumn{N}{FORMAT}{ITEM} : replaces the next N column items by
  4355. %       ITEM, formatted according to FORMAT.  FORMAT should contain at most
  4356. %       one l,r or c.  If it contains none, then ITEM is ignored.
  4357. %
  4358. %   \vline : draws a vertical line the height of the current row.  May
  4359. %            appear in an array element entry.
  4360. %   \hline : draws a horizontal line between rows.  Must appear either
  4361. %            before the first entry (to appear above the first row) or right
  4362. %            after a \\ command.  If followed by another \hline, then adds
  4363. %            a \vskip of \doublerulesep.
  4364. %
  4365. %   \cline[i-j] : draws horizontal lines between rows covering columns
  4366. %                 i through j, inclusive.  Multiple commands may follow
  4367. %                 one another to provide lines covering several disjoint
  4368. %                 columns
  4369. %   \extracolsep{WIDTH} : for use inside an @ in the preamble.  Causes a WIDTH
  4370. %                 space to be added between columns for the rest of the
  4371. %                 columns.  This is in addition to the ordinary intercolumn
  4372. %                 space.
  4373. %
  4374. %  \array ==
  4375. %    BEGIN
  4376. %      \@acol    == \@arrayacol
  4377. %      \@classz  == \@arrayclassz
  4378. %      \@classiv == \@arrayclassiv
  4379. %      \\        == \@arraycr
  4380. %      \@halignto == NULL
  4381. %      \@tabarray
  4382. %    END
  4383. %
  4384. %  \endarray{NAME} ==  BEGIN  \crcr }}  END
  4385. %
  4386. %  \tabular  ==
  4387. %    BEGIN
  4388. %      \@halignto == NULL
  4389. %      \@tabular
  4390. %    END
  4391. %
  4392. %  \tabular*{WIDTH} ==
  4393. %    BEGIN
  4394. %      \@halignto == to WIDTH
  4395. %      \@tabular
  4396. %    END
  4397. %
  4398. %  \@tabular ==
  4399. %    BEGIN
  4400. %      \leavevmode
  4401. %      \hbox { $
  4402. %         \@acol    == \@tabacol
  4403. %         \@classz  == \@tabclassz
  4404. %         \@classiv == \@tabclassiv
  4405. %         \\        == \@tabularcr
  4406. %         \@tabarray
  4407. %    END
  4408. %
  4409. %  \endtabular == BEGIN \crcr}} $} END
  4410. %
  4411. %  \@tabarray == if next char = [ then \@array else \@array[c] fi
  4412. %
  4413. %  \@array[POS]{PREAMBLE} ==
  4414. %    BEGIN
  4415. %      define \@arstrutbox to make \@arstrut produce strut of height
  4416. %        and depth \arraystretch times the height and
  4417. %        depth of a normal strut.
  4418. %      \@mkpream{PREAMBLE}
  4419. %      \@preamble == \halign \@halignto {\tabskip=0pt\@arstrut
  4420. %                              eval{\@preamble}\tabskip = 0pt\cr  %% }
  4421. %      \@startpbox == \@@startpbox
  4422. %      \@endpbox == \@@endpbox
  4423. %      if POS = t then \vtop
  4424. %                 else if POS = b then \vbox
  4425. %                                 else \vcenter
  4426. %      fi              fi
  4427. %     {
  4428. %      \par          ==L \relax
  4429. %      \@sharp       == #
  4430. %      \protect      == \relax
  4431. %      \lineskip     :=L 0pt
  4432. %      \baselineskip :=L 0pt
  4433. %      \@preamble
  4434. %    END
  4435. %
  4436. %
  4437. %  \@arraycr ==
  4438. %   BEGIN
  4439. %     $                    %% Prevents extra space at end of row's last entry.
  4440. %     if next char = [
  4441. %      then  \@argarraycr
  4442. %      else  $ \cr         %% Needed to balance $
  4443. %   END
  4444. %
  4445. %  \@argarraycr[LENGTH] ==
  4446. %   BEGIN
  4447. %     $                    %% Needed to balance $ of \@arraycr
  4448. %     if LENGTH > 0
  4449. %       then  \@tempdima := depth of \@arstrutbox + LENGTH
  4450. %             \vrule height 0pt width 0pt depth \@tempdima
  4451. %             \cr
  4452. %       else  \cr \noalign{\vskip LENGTH}
  4453. %   END
  4454. %
  4455. %  \@tabularcr and \@argtabularcr  same as \@arraycr and \@argarraycr
  4456. %  except without the extra $'s.
  4457.  
  4458. \def\extracolsep#1{\tabskip #1\relax}
  4459.  
  4460. \def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz
  4461.  \let\@classiv\@arrayclassiv \let\\\@arraycr\def\@halignto{}\@tabarray}
  4462.  
  4463. \def\endarray{\crcr\egroup\egroup}
  4464. \def\endtabular{\crcr\egroup\egroup $\egroup}
  4465. \expandafter \let \csname endtabular*\endcsname = \endtabular
  4466.  
  4467. \def\tabular{\def\@halignto{}\@tabular}
  4468.  
  4469. \expandafter \def\csname tabular*\endcsname #1{\def\@halignto{to #1}\@tabular}
  4470.  
  4471. \def\@tabular{\leavevmode \hbox \bgroup $\let\@acol\@tabacol
  4472.    \let\@classz\@tabclassz
  4473.    \let\@classiv\@tabclassiv \let\\\@tabularcr\@tabarray}
  4474.  
  4475. \def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
  4476.  
  4477. \def\@array[#1]#2{\setbox\@arstrutbox=\hbox{\vrule
  4478.      height\arraystretch \ht\strutbox
  4479.      depth\arraystretch \dp\strutbox
  4480.      width\z@}\@mkpream{#2}\edef\@preamble{\halign \noexpand\@halignto
  4481. \bgroup \tabskip\z@ \@arstrut \@preamble \tabskip\z@ \cr}%
  4482. \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
  4483.   \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
  4484.   \bgroup \let\par\relax
  4485.   \let\@sharp##\let\protect\relax \lineskip\z@\baselineskip\z@\@preamble}
  4486.  
  4487. \def\@arraycr{${\ifnum0=`}\fi\@ifstar{\@xarraycr}{\@xarraycr}}
  4488. \def\@xarraycr{\@ifnextchar[{\@argarraycr}{\ifnum0=`{\fi}${}\cr}}
  4489.  
  4490. \def\@argarraycr[#1]{\ifnum0=`{\fi}${}\ifdim #1>\z@ \@xargarraycr{#1}\else
  4491.    \@yargarraycr{#1}\fi}
  4492.  
  4493. \def\@tabularcr{{\ifnum0=`}\fi\@ifstar{\@xtabularcr}{\@xtabularcr}}
  4494. \def\@xtabularcr{\@ifnextchar[{\@argtabularcr}{\ifnum0=`{\fi}\cr}}
  4495.  
  4496. \def\@argtabularcr[#1]{\ifnum0=`{\fi}\ifdim #1>\z@
  4497.    \unskip\@xargarraycr{#1}\else \@yargarraycr{#1}\fi}
  4498.  
  4499. \def\@xargarraycr#1{\@tempdima #1\advance\@tempdima \dp \@arstrutbox
  4500.    \vrule \@height\z@ \@depth\@tempdima \@width\z@ \cr}
  4501.  
  4502. \def\@yargarraycr#1{\cr\noalign{\vskip #1}}
  4503.  
  4504.  
  4505. % \multicolumn{NUMBER}{FORMAT}{ITEM} ==
  4506. %  BEGIN
  4507. %  \multispan{NUMBER}
  4508. %  \begingroup
  4509. %  \@addamp == null
  4510. %  \@mkpream{FORMAT}
  4511. %  \@sharp == ITEM
  4512. %  \protect == \relax
  4513. %  \@startpbox == \@@startpbox
  4514. %  \@endpbox == \@@endpbox
  4515. %  \@arstrut
  4516. %  \@preamble
  4517. %  \endgroup
  4518. %  END
  4519.  
  4520. % The command \def\@addamp{} was removed from \multicolumn on 6 Dec 86
  4521. % because it caused embedded array environments not to work.  I think
  4522. % that it was included originally to prevent an error message if
  4523. % the 2nd argument to the \multicolumn command had two column specifiers.
  4524. %
  4525. % 8 Feb 89 - \hbox{} added after \@preamble to correct bug that
  4526. %            occurred if \multicolumn preceded \\[D] with D > 0,
  4527. %            caused by \\[] command doing an \unskip, which removed
  4528. %            \tabcolsep glue inserted by \multicolumn
  4529.  
  4530. \def\multicolumn#1#2#3{\multispan{#1}\begingroup
  4531. \@mkpream{#2}%
  4532. \def\@sharp{#3}\let\protect\relax
  4533.   \let\@startpbox\@@startpbox\let\@endpbox\@@endpbox
  4534.   \@arstrut \@preamble\hbox{}\endgroup\ignorespaces}
  4535.  
  4536.  
  4537. % Codes for classes and character numbers of array, tabular and
  4538. % multicolumn arguments.
  4539. %
  4540. %    Character     Class       Number
  4541. %    ---------     -----       ------
  4542. %        c           0           0
  4543. %        l           0           1
  4544. %        r           0           2
  4545. %
  4546. %        |           1           -
  4547. %        @           2           -
  4548. %        p           3           -
  4549. %      {@-exp}       4           -
  4550. %      {p-arg}       5           -
  4551. %
  4552. % \@testpach \foo : expands \foo, which should be an array parameter token,
  4553. %                   and sets \@chclass and \@chnum to its class and number.
  4554. %                   Uses \@lastchclass to distinguish 4 and 5
  4555. %
  4556. % Preamble error codes
  4557. %    0: 'illegal character'
  4558. %    1: 'Missing @-exp'
  4559. %    2: 'Missing p-arg'
  4560. %
  4561. % \@addamp ==
  4562. %   BEGIN if @firstamp = true then @firstamp := false
  4563. %                             else &                     fi
  4564. %   END
  4565. %
  4566. % \@mkpream TOKENLIST ==
  4567. %   BEGIN
  4568. %    @firstamp     := T
  4569. %    \@lastchclass := 6
  4570. %    \@preamble    == null
  4571. %    \@sharp       == \relax
  4572. %    \protect      == BEGIN \noexpand\protect\noexpand END
  4573. %    \@startpbox   == \relax
  4574. %    \@endpbox     == \relax
  4575. %    \@expast{TOKENLIST}
  4576. %    for \@nextchar := expand(\@tempa)
  4577. %      do  \@testpach{\@nextchar}
  4578. %          case of \@chclass
  4579. %            0 -> \@classz
  4580. %            1 -> \@classi
  4581. %              ...
  4582. %            5 -> \@classv
  4583. %          end case
  4584. %          \@lastchclass := \@chclass
  4585. %      od
  4586. %      case of \@lastchclass
  4587. %         0 -> \hskip \arraycolsep             % lrc
  4588. %         1 ->                                  % |
  4589. %         2 -> \@preamerr1 % 'Missing @-exp'    % @
  4590. %         3 -> \@preamerr2 % 'Missing p-arg'    % p
  4591. %         4 ->                                  % @-exp
  4592. %         5 -> \hskip \arraycolsep             % p-exp
  4593. %      end case
  4594. %   END
  4595. %
  4596. %  \@arrayclassz ==
  4597. %    BEGIN
  4598. %      \@preamble := \@preamble *
  4599. %                    case of \@lastchclass
  4600. %                       0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
  4601. %                       1 -> \@addamp \hskip \arraycolsep
  4602. %                       2 ->  % impossible
  4603. %                       3 ->  % impossible
  4604. %                       4 -> \@addamp
  4605. %                       5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
  4606. %                       6 -> \@addamp \hskip \arraycolsep
  4607. %                     end case
  4608. %                   * case of \@chnum
  4609. %                        0 -> \hfil$\relax\@sharp$\hfil
  4610. %                        1 -> $\relax\@sharp$\hfil
  4611. %                        2 -> \hfil$\relax\@sharp$
  4612. %                     end case
  4613. %    END
  4614. %
  4615. % \@tabclassz == similar to \@arrayclassz
  4616. %
  4617. % \@classi ==
  4618. %  BEGIN
  4619. %    \@preamble := \@preamble *
  4620. %                  case of \@lastchclass
  4621. %                     0 -> \hskip \arraycolsep \@arrayrule
  4622. %                     1 -> \hskip \doublerulesep \@arrayrule
  4623. %                     2 -> % impossible
  4624. %                     3 -> % impossible
  4625. %                     4 -> \@arrayrule
  4626. %                     5 -> \hskip \arraycolsep \@arrayrule
  4627. %                     6 -> \@arrayrule
  4628. %                  end case
  4629. %  END
  4630. %
  4631. % \@classii ==
  4632. %  BEGIN
  4633. %    \@preamble := \@preamble *
  4634. %                  case of \@lastchclass
  4635. %                     0    ->
  4636. %                     1    -> \hskip .5\arrayrulewidth
  4637. %                     2    -> % impossible
  4638. %                     else ->
  4639. %                  end case
  4640. %  END
  4641. %
  4642. % \@classiii ==
  4643. %  BEGIN
  4644. %    \@preamble := \@preamble *
  4645. %                  case of \@lastchclass
  4646. %                     0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
  4647. %                     1 -> \@addamp \hskip \arraycolsep
  4648. %                     2 -> % impossible
  4649. %                     3 -> % impossible
  4650. %                     4 -> \@addamp
  4651. %                     5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep
  4652. %                     6 -> \@addamp \hskip \arraycolsep
  4653. %                  end case
  4654. %  END
  4655. %
  4656. % \@arrayclassiv  ==  BEGIN  \@preamble := \@preamble * $ \@nextchar$  END
  4657. %
  4658. % \@tabclassiv   == same as \@arrayclassv except without the $ ... $
  4659. %
  4660. % \@classv ==
  4661. %   BEGIN
  4662. %    \@preamble := \@preamble * \@startpbox{\@nextchar}\ignorespaces\@sharp
  4663. %                               \@endpbox
  4664. %   END
  4665. %
  4666. % \@expast{S}: Sets \@tempa := S with all instances of *{N}{STRING}
  4667. %              replaced by N copies of STRING, where N > 0.  An *
  4668. %              appearing inside braces is ignored, but *-expressions
  4669. %              inside STRING are expanded, so nested *-expressions are
  4670. %              handled properly.
  4671. %
  4672. % \@expast{S} == BEGIN  \@xexpast S *0x\@@  END
  4673. %
  4674. % \@xexpast S1 *{N}{S2} S3 \@@ ==
  4675. %  BEGIN
  4676. %    \@tempa   := S1
  4677. %    \@tempcnta := N
  4678. %    if \@tempcnta > 0
  4679. %      then  while \@tempcnta > 0 do \@tempa   := \@tempa S2
  4680. %                                   \@tempcnta := \@tempcnta - 1 od
  4681. %            \@tempb == \@xexpast
  4682. %      else  \@tempb == \@xexnoop
  4683. %    fi
  4684. %    \expandafter \@tempb \@tempa S3 \@@
  4685. %  END
  4686. %
  4687.  
  4688. \def\@xexnoop #1\@@{}
  4689.  
  4690. \def\@expast#1{\@xexpast #1*0x\@@}
  4691.  
  4692. \def\@xexpast#1*#2#3#4\@@{\edef\@tempa{#1}\@tempcnta#2\relax
  4693.     \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
  4694.        {\edef\@tempa{\@tempa#3}\advance\@tempcnta by \m@ne}\let\@tempb\@xexpast
  4695.       \else \let\@tempb\@xexnoop\fi
  4696.     \expandafter\@tempb \@tempa #4\@@}
  4697.  
  4698.  
  4699. \newif\if@firstamp
  4700. \def\@addamp{\if@firstamp \@firstampfalse \else
  4701.     \edef\@preamble{\@preamble &}\fi}
  4702. \def\@arrayacol{\edef\@preamble{\@preamble \hskip \arraycolsep}}
  4703. \def\@tabacol{\edef\@preamble{\@preamble \hskip \tabcolsep}}
  4704. \def\@ampacol{\@addamp \@acol}
  4705. \def\@acolampacol{\@acol\@addamp\@acol}
  4706.  
  4707. \def\@mkpream#1{\@firstamptrue\@lastchclass6
  4708. \def\@preamble{}\def\protect{\noexpand\protect\noexpand}\let\@sharp\relax
  4709. \let\@startpbox\relax\let\@endpbox\relax
  4710. \@expast{#1}\expandafter\@tfor \expandafter
  4711.   \@nextchar \expandafter:\expandafter=\@tempa\do{\@testpach\@nextchar
  4712.   \ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii
  4713.     \or \@classiv \or\@classv \fi\@lastchclass\@chclass}%
  4714. \ifcase \@lastchclass \@acol
  4715.     \or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi}
  4716.  
  4717. \def\@arrayclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
  4718.    \or \or \@addamp \or
  4719.    \@acolampacol \or \@firstampfalse \@acol \fi
  4720. \edef\@preamble{\@preamble
  4721.   \ifcase \@chnum
  4722.      \hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil
  4723.     \or \hfil$\relax\@sharp$\fi}}
  4724.  
  4725. \def\@tabclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or
  4726.    \or \or \@addamp \or
  4727.    \@acolampacol \or \@firstampfalse \@acol \fi
  4728. \edef\@preamble{\@preamble
  4729.   \ifcase \@chnum
  4730.      \hfil\ignorespaces\@sharp\unskip\hfil
  4731.      \or \ignorespaces\@sharp\unskip\hfil
  4732.      \or \hfil\hskip\z@ \ignorespaces\@sharp\unskip\fi}}
  4733.  
  4734. \def\@classi{\ifcase \@lastchclass \@acol \@arrayrule \or
  4735.    \@addtopreamble{\hskip \doublerulesep}\@arrayrule\or
  4736.    \or \or \@arrayrule \or
  4737.    \@acol \@arrayrule \or \@arrayrule \fi}
  4738.  
  4739.  
  4740. \def\@classii{\ifcase \@lastchclass \or
  4741.    \@addtopreamble{\hskip .5\arrayrulewidth}\fi}
  4742.  
  4743. \def\@classiii{\ifcase \@lastchclass \@acolampacol \or
  4744.    \@addamp\@acol \or
  4745.    \or \or \@addamp \or
  4746.    \@acolampacol \or \@ampacol \fi}
  4747.  
  4748. \def\@tabclassiv{\@addtopreamble\@nextchar}
  4749.  
  4750. \def\@arrayclassiv{\@addtopreamble{$ \@nextchar$}}
  4751.  
  4752. \def\@classv{\@addtopreamble{\@startpbox{\@nextchar}\ignorespaces
  4753. \@sharp\@endpbox}}
  4754.  
  4755. \def\@addtopreamble#1{\edef\@preamble{\@preamble #1}}
  4756.  
  4757. \newcount\@chclass
  4758. \newcount\@lastchclass
  4759. \newcount\@chnum
  4760.  
  4761. \newdimen\arraycolsep
  4762. \newdimen\tabcolsep
  4763. \newdimen\arrayrulewidth
  4764. \newdimen\doublerulesep
  4765.  
  4766. \def\arraystretch{1}    % Default value.
  4767.  
  4768. \newbox\@arstrutbox
  4769. \def\@arstrut{\relax\ifmmode\copy\@arstrutbox\else\unhcopy\@arstrutbox\fi}
  4770.  
  4771.  
  4772. \def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth
  4773.    \vrule \@width \arrayrulewidth\hskip -.5\arrayrulewidth}}
  4774.  
  4775. \def\@testpach#1{\@chclass \ifnum \@lastchclass=\tw@ 4 \else
  4776.     \ifnum \@lastchclass=3 5 \else
  4777.      \z@ \if #1c\@chnum \z@ \else
  4778.                               \if #1l\@chnum \@ne \else
  4779.                               \if #1r\@chnum \tw@ \else
  4780.           \@chclass \if #1|\@ne \else
  4781.                     \if #1@\tw@ \else
  4782.                     \if #1p3 \else \z@ \@preamerr 0\fi
  4783.   \fi  \fi  \fi  \fi  \fi  \fi
  4784. \fi}
  4785.  
  4786. \def\hline{\noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet
  4787.    \@tempa\@xhline}
  4788.  
  4789. \def\@xhline{\ifx\@tempa\hline\vskip \doublerulesep\fi
  4790.       \ifnum0=`{\fi}}
  4791.  
  4792. \def\vline{\vrule \@width \arrayrulewidth}
  4793.  
  4794. \newcount\@cla
  4795. \newcount\@clb
  4796.  
  4797. \def\cline#1{\@cline[#1]}
  4798. \def\@cline[#1-#2]{\noalign{\global\@cla#1\relax
  4799. \global\advance\@cla\m@ne
  4800. \ifnum\@cla>0\global\let\@gtempa\@clinea\else
  4801.   \global\let\@gtempa\@clineb\fi
  4802. \global\@clb#2\relax
  4803. \global\advance\@clb-\@cla}\@gtempa
  4804. \noalign{\vskip-\arrayrulewidth}}
  4805.  
  4806. \def\@clinea{\multispan\@cla&\multispan\@clb
  4807. \unskip\leaders\hrule \@height \arrayrulewidth \hfill
  4808. \cr}
  4809.  
  4810. \def\@clineb{\multispan\@clb
  4811. \unskip\leaders\hrule \@height \arrayrulewidth \hfill
  4812. \cr}
  4813.  
  4814. % \@startpbox{WIDTH} TEXT \egroup == \parbox{WIDTH}{TEXT}
  4815. % \@endpbox == \unskip \strut \par \egroup\hfil (Changed 14 Jan 89)
  4816. %
  4817.  
  4818. \def\@startpbox#1{\vtop\bgroup \hsize #1\@arrayparboxrestore}
  4819. \def\@endpbox{\unskip\strut\par\egroup\hfil}
  4820.  
  4821. % 14 Jan 89: Def of \@endpbox changed from
  4822. %    \def\@endpbox{\par\vskip\dp\@arstrutbox\egroup\hfil}
  4823. % so vertical spacing works out right if the last line of a `p' entry
  4824. % has a descender.
  4825.  
  4826. \let\@@startpbox=\@startpbox
  4827. \let\@@endpbox=\@endpbox
  4828.  
  4829.  \message{picture,}
  4830. %      ****************************************
  4831. %      *       THE PICTURE ENVIRONMENT        *
  4832. %      ****************************************
  4833. %
  4834. %  \unitlength     = value of dimension argument
  4835. %  \@wholewidth    = current line width
  4836. %  \@halfwidth     = half of current line width
  4837. %  \@linefnt       = font for drawing lines
  4838. %  \@circlefnt     = font for drawing circles
  4839. %
  4840. % \linethickness{DIM} : Sets the width of horizontal and vertical lines
  4841. %     in a picture to DIM.  Does not change width of slanted lines
  4842. %     or circles.   Width of all lines reset by \thinlines and
  4843. %     \thicklines
  4844. %
  4845. % \picture(XSIZE,YSIZE)(XORG,YORG)
  4846. %   BEGIN
  4847. %     \@picht :=L YSIZE * \unitlength
  4848. %     box \@picbox :=
  4849. %          \hbox to XSIZE * \unitlength
  4850. %            {\hskip -XORG * \unitlength
  4851. %             \lower YORG * \unitlength
  4852. %             \hbox{
  4853. %             \ignorespaces    %% added 13 June 89
  4854. %   END
  4855. %
  4856. % \endpicture ==
  4857. %   BEGIN
  4858. %                   } \hss }
  4859. %                   heigth of \@picbox := \@picht
  4860. %                   depth  of \@picbox := 0
  4861. %                   leavevmode
  4862. %                   \box\@picbox
  4863. %   END
  4864. %
  4865. % \put(X, Y){OBJ} ==
  4866. %   BEGIN
  4867. %     \@killglue
  4868. %     \raise Y * \unitlength  \hbox to 0pt { \hskip X * \unitlength
  4869. %                                              OBJ \hss             }
  4870. %     \ignorespaces
  4871. %   END
  4872. %
  4873. % \multiput(X,Y)(DELX,DELY){N}{OBJ} ==
  4874. %   BEGIN
  4875. %    \@killglue
  4876. %    \@multicnt := N
  4877. %    \@xdim  := X * \unitlength
  4878. %    \@ydim  := Y * \unitlength
  4879. %    while \@multicnt > 0
  4880. %      do \raise \@ydim \hbox to 0pt { \hskip \@xdim
  4881. %                                             OBJ \hss   }
  4882. %         \@multicnt := \@multicnt - 1
  4883. %         \@xdim     := \@xdim + DELX * \unitlength
  4884. %         \@ydim     := \@ydim + DELY * \unitlength
  4885. %      od
  4886. %    \ignorespaces
  4887. %   END
  4888. %
  4889. %  \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as
  4890. %      a one-column array, positioned l, r or c as indicated by POS.
  4891.  
  4892. \newdimen\@wholewidth
  4893. \newdimen\@halfwidth
  4894. \newdimen\unitlength \unitlength =1pt
  4895. \newbox\@picbox
  4896. \newdimen\@picht
  4897.  
  4898. \def\picture(#1,#2){\@ifnextchar({\@picture(#1,#2)}{\@picture(#1,#2)(0,0)}}
  4899.  
  4900. \def\@picture(#1,#2)(#3,#4){\@picht #2\unitlength
  4901. \setbox\@picbox\hbox to #1\unitlength\bgroup
  4902. \hskip -#3\unitlength \lower #4\unitlength \hbox\bgroup\ignorespaces}
  4903.  
  4904. \def\endpicture{\egroup\hss\egroup\ht\@picbox\@picht
  4905. \dp\@picbox\z@\leavevmode\box\@picbox}
  4906.  
  4907. % In the definitions of \put and \multiput, \hskip was replaced by \kern
  4908. % just in case arg #3 = ``plus''.  (Bug detected by Don Knuth.
  4909. % changed 20 Jul 87).
  4910. %
  4911. \long\def\put(#1,#2)#3{\@killglue\raise#2\unitlength\hbox to \z@{\kern
  4912. #1\unitlength #3\hss}\ignorespaces}
  4913.  
  4914. \long\def\multiput(#1,#2)(#3,#4)#5#6{\@killglue\@multicnt=#5\relax
  4915. \@xdim=#1\unitlength
  4916. \@ydim=#2\unitlength
  4917. \@whilenum \@multicnt > 0\do
  4918. {\raise\@ydim\hbox to \z@{\kern
  4919. \@xdim #6\hss}\advance\@multicnt \m@ne\advance\@xdim
  4920. #3\unitlength\advance\@ydim #4\unitlength}\ignorespaces}
  4921.  
  4922. \def\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}
  4923.  
  4924. \def\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
  4925.   \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
  4926. \def\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw
  4927.   \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}
  4928.  
  4929. \def\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth}
  4930.  
  4931. \def\shortstack{\@ifnextchar[{\@shortstack}{\@shortstack[c]}}
  4932.  
  4933. \def\@shortstack[#1]{\leavevmode
  4934. \vbox\bgroup\baselineskip-1pt\lineskip 3pt\let\mb@l\hss
  4935. \let\mb@r\hss \expandafter\let\csname mb@#1\endcsname\relax
  4936. \let\\\@stackcr\@ishortstack}
  4937.  
  4938. \def\@ishortstack#1{\halign{\mb@l ##\unskip\mb@r\cr #1\crcr}\egroup}
  4939.  
  4940.  
  4941. \def\@stackcr{\@ifstar{\@ixstackcr}{\@ixstackcr}}
  4942. \def\@ixstackcr{\@ifnextchar[{\@istackcr}{\cr\ignorespaces}}
  4943.  
  4944. \def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
  4945.  
  4946.  
  4947. % \line(X,Y){LEN} ==
  4948. % BEGIN
  4949. %  \@xarg    := X
  4950. %  \@yarg    := Y
  4951. %  \@linelen := LEN * \unitlength
  4952. %  if \@xarg = 0
  4953. %     then \@vline
  4954. %     else if \@yarg = 0
  4955. %            then \@hline
  4956. %            else \@sline
  4957. %          if
  4958. %  if
  4959. % END
  4960. %
  4961. % \@sline ==
  4962. %  BEGIN
  4963. %    if \@xarg < 0
  4964. %      then @negarg := T
  4965. %           \@xarg  := -\@xarg
  4966. %           \@yyarg := -\@yarg
  4967. %      else @negarg := F
  4968. %           \@yyarg := \@yarg
  4969. %    fi
  4970. %    \@tempcnta := |\@yyarg|
  4971. %    if \@tempcnta > 6
  4972. %      then error: 'LATEX ERROR: Illegal \line or \vector argument.'
  4973. %           \@tempcnta := 0
  4974. %    fi
  4975. %    \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) }
  4976. %     if \@yarg > 0 then \@upordown = \raise
  4977. %                         \@clnht := 0
  4978. %                   else \@upordown = \lower
  4979. %                        \@clnht := height of \box\@linechar
  4980. %     fi
  4981. %     \@clnwd  := width of \box\@linechar
  4982. %     if @negarg
  4983. %       then \hskip - width of \box\@linechar
  4984. %            \@tempa == \hskip - 2* width of box \@linechar
  4985. %       else \@tempa == \relax
  4986. %     fi
  4987. %  %% Put out integral number of line segments
  4988. %     while \@clnwd <  \@linelen
  4989. %       do  \@upordown \@clnht \copy\@linechar
  4990. %           \@tempa
  4991. %           \@clnht := \@clnht + ht of \box\@linechar
  4992. %           \@clnwd := \@clnwd + width of \box\@linechar
  4993. %       od
  4994. %
  4995. %  %% Put out last segment
  4996. %     \@clnht := \@clnht - height of \box\@linechar
  4997. %     \@clnwd := \@clnwd - width of \box\@linechar
  4998. %     \@tempdima   := \@linelen - \@clnwd
  4999. %     \@tempdimb   := \@tempdima - width of \box\@linechar
  5000. %     if @negarg  then \hskip -\@tempdimb
  5001. %                 else \hskip  \@tempdimb
  5002. %     fi
  5003. %     \@tempdima   := 1000 * \@tempdima
  5004. %     \@tempcnta   := \@tempdima / width of \box\@linechar
  5005. %     \@tempdima   := (\@tempcnta * ht of \box\@linechar)/1000
  5006. %     \@clnht := \@clnht + \@tempdima
  5007. %     if \@linelen < width of box\@linechar
  5008. %         then \hskip width of box\@linechar
  5009. %         else \hbox{\@upordown \@clnht \copy\@linechar}
  5010. %     fi
  5011. % END
  5012. %
  5013. % \@hline ==
  5014. %   BEGIN
  5015. %     if \@xarg < 0 then  \hskip -\@linelen \fi
  5016. %     \vrule height \@halfwidth depth \@halfwidth width \@linelen
  5017. %     if \@xarg < 0 then  \hskip -\@linelen \fi
  5018. %  END
  5019. %
  5020. % \@vline == if \@yarg < 0 \@downline else \@upline  fi
  5021. %
  5022. %
  5023. % \@getlinechar(X,Y) ==
  5024. %   BEGIN
  5025. %     \@tempcnta := 8*X - 9
  5026. %     if Y > 0
  5027. %       then \@tempcnta := \@tempcnta + Y
  5028. %       else \@tempcnta := \@tempcnta - Y + 64
  5029. %     fi
  5030. %     \char\@tempcnta
  5031. %   END
  5032. %
  5033. % \vector(X,Y){LEN} ==
  5034. % BEGIN
  5035. %  \@xarg    := X
  5036. %  \@yarg    := Y
  5037. %  \@linelen := LEN * \unitlength
  5038. %  if \@xarg = 0
  5039. %     then \@vvector
  5040. %     else if \@yarg = 0
  5041. %            then \@hvector
  5042. %            else \@svector
  5043. %          if
  5044. %  if
  5045. % END
  5046. %
  5047. % \@hvector ==
  5048. %   BEGIN
  5049. %     \@hline
  5050. %     {\@linefnt if \@xarg < 0 then  \@getlarrow(1,0)
  5051. %                              else  \@getrarrow(1,0)
  5052. %                 fi}
  5053. %   END
  5054. %
  5055. % \@vvector == if \@yarg < 0 \@downvector else \@upvector  fi
  5056. %
  5057. % \@svector ==
  5058. %  BEGIN
  5059. %   \@sline
  5060. %   \@tempcnta := |\@yarg|
  5061. %     if  \@tempcnta < 5
  5062. %        then  \hskip - width of \box\@linechar
  5063. %              \@upordown \@clnht \hbox
  5064. %                       {\@linefnt
  5065. %                        if @negarg then \@getlarrow(\@xarg,\@yyarg)
  5066. %                                   else \@getrarrow(\@xarg,\@yyarg)
  5067. %                        fi }
  5068. %        else  error: 'LATEX ERROR: Illegal \line or \vector argument.'
  5069. %     fi
  5070. %  END
  5071. %
  5072. % \@getlarrow(X,Y) ==
  5073. %  BEGIN
  5074. %   if Y = 0
  5075. %     then \@tempcnta := '33
  5076. %     else \@tempcnta := 16 * X  -  9
  5077. %          \@tempcntb := 2 * Y
  5078. %          if \@tempcntb > 0
  5079. %            then  \@tempcnta := \@tempcnta  +  \@tempcntb
  5080. %            else  \@tempcnta := \@tempcnta  -  \@tempcntb +  64
  5081. %          fi
  5082. %   fi
  5083. %   \char\@tempcnta
  5084. %  END
  5085. %
  5086. % \@getrarrow(X,Y) ==
  5087. %  BEGIN
  5088. %   \@tempcntb := |Y|
  5089. %   case of \@tempcntb
  5090. %     0 : \@tempcnta := '55
  5091. %     1 : if X < 3
  5092. %           then \@tempcnta :=  24*X - 6
  5093. %           else if X = 3
  5094. %                  then \@tempcnta := 49
  5095. %                  else \@tempcnta := 58  fi
  5096. %         fi
  5097. %     2 : if X < 3
  5098. %           then \@tempcnta :=  24*X - 3
  5099. %           else \@tempcnta := 51     % X must = 3
  5100. %         fi
  5101. %     3 : \@tempcnta := 16*X - 2
  5102. %     4 : \@tempcnta := 16*X + 7
  5103. %   endcase
  5104. %   if Y < 0
  5105. %     then \@tempcnta := \@tempcnta + 64
  5106. %   fi
  5107. %   \char\@tempcnta
  5108. %  END
  5109.  
  5110. \newif\if@negarg
  5111.  
  5112. \def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
  5113. \@linelen=#3\unitlength
  5114. \ifnum\@xarg =0 \@vline
  5115.   \else \ifnum\@yarg =0 \@hline \else \@sline\fi
  5116. \fi}
  5117.  
  5118. \def\@sline{\ifnum\@xarg< 0 \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
  5119.   \else \@negargfalse \@yyarg \@yarg \fi
  5120. \ifnum \@yyarg >0 \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
  5121. \ifnum\@tempcnta>6 \@badlinearg\@tempcnta0 \fi
  5122. \ifnum\@xarg>6 \@badlinearg\@xarg 1 \fi
  5123. \setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}%
  5124. \ifnum \@yarg >0 \let\@upordown\raise \@clnht\z@
  5125.    \else\let\@upordown\lower \@clnht \ht\@linechar\fi
  5126. \@clnwd=\wd\@linechar
  5127. \if@negarg \hskip -\wd\@linechar \def\@tempa{\hskip -2\wd\@linechar}\else
  5128.      \let\@tempa\relax \fi
  5129. \@whiledim \@clnwd <\@linelen \do
  5130.   {\@upordown\@clnht\copy\@linechar
  5131.    \@tempa
  5132.    \advance\@clnht \ht\@linechar
  5133.    \advance\@clnwd \wd\@linechar}%
  5134. \advance\@clnht -\ht\@linechar
  5135. \advance\@clnwd -\wd\@linechar
  5136. \@tempdima\@linelen\advance\@tempdima -\@clnwd
  5137. \@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar
  5138. \if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi
  5139. \multiply\@tempdima \@m
  5140. \@tempcnta \@tempdima \@tempdima \wd\@linechar \divide\@tempcnta \@tempdima
  5141. \@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta
  5142. \divide\@tempdima \@m
  5143. \advance\@clnht \@tempdima
  5144. \ifdim \@linelen <\wd\@linechar
  5145.    \hskip \wd\@linechar
  5146.   \else\@upordown\@clnht\copy\@linechar\fi}
  5147.  
  5148. \def\@hline{\ifnum \@xarg <0 \hskip -\@linelen \fi
  5149. \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
  5150. \ifnum \@xarg <0 \hskip -\@linelen \fi}
  5151.  
  5152. \def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8
  5153. \advance\@tempcnta -9 \ifnum #2>0 \advance\@tempcnta #2\relax\else
  5154. \advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi
  5155. \char\@tempcnta}
  5156.  
  5157. \def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
  5158. \@tempcnta \ifnum\@xarg<0 -\@xarg\else\@xarg\fi
  5159. \ifnum\@tempcnta<5\relax
  5160. \@linelen=#3\unitlength
  5161. \ifnum\@xarg =0 \@vvector
  5162.   \else \ifnum\@yarg =0 \@hvector \else \@svector\fi
  5163. \fi
  5164. \else\@badlinearg\fi}
  5165.  
  5166. \def\@hvector{\@hline\hbox to 0pt{\@linefnt
  5167. \ifnum \@xarg <0 \@getlarrow(1,0)\hss\else
  5168.     \hss\@getrarrow(1,0)\fi}}
  5169.  
  5170. \def\@vvector{\ifnum \@yarg <0 \@downvector \else \@upvector \fi}
  5171.  
  5172. \def\@svector{\@sline
  5173. \@tempcnta\@yarg \ifnum\@tempcnta <0 \@tempcnta=-\@tempcnta\fi
  5174. \ifnum\@tempcnta <5
  5175.   \hskip -\wd\@linechar
  5176.   \@upordown\@clnht \hbox{\@linefnt  \if@negarg
  5177.   \@getlarrow(\@xarg,\@yyarg) \else \@getrarrow(\@xarg,\@yyarg) \fi}%
  5178. \else\@badlinearg\fi}
  5179.  
  5180. \def\@getlarrow(#1,#2){\ifnum #2 =\z@ \@tempcnta='33\else
  5181. \@tempcnta=#1\relax\multiply\@tempcnta \sixt@@n \advance\@tempcnta
  5182. -9 \@tempcntb=#2\relax\multiply\@tempcntb \tw@
  5183. \ifnum \@tempcntb >0 \advance\@tempcnta \@tempcntb\relax
  5184. \else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64
  5185. \fi\fi\char\@tempcnta}
  5186.  
  5187. \def\@getrarrow(#1,#2){\@tempcntb=#2\relax
  5188. \ifnum\@tempcntb < 0 \@tempcntb=-\@tempcntb\relax\fi
  5189. \ifcase \@tempcntb\relax \@tempcnta='55 \or
  5190. \ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta
  5191. 24 \advance\@tempcnta -6 \else \ifnum #1=3 \@tempcnta=49
  5192. \else\@tempcnta=58 \fi\fi\or
  5193. \ifnum #1<3 \@tempcnta=#1\relax\multiply\@tempcnta
  5194. 24 \advance\@tempcnta -3 \else \@tempcnta=51\fi\or
  5195. \@tempcnta=#1\relax\multiply\@tempcnta
  5196. \sixt@@n \advance\@tempcnta -\tw@ \else
  5197. \@tempcnta=#1\relax\multiply\@tempcnta
  5198. \sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<0 \advance\@tempcnta 64 \fi
  5199. \char\@tempcnta}
  5200.  
  5201.  
  5202.  
  5203. \def\@vline{\ifnum \@yarg <0 \@downline \else \@upline\fi}
  5204.  
  5205. \def\@upline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
  5206.    \@height \@linelen \@depth \z@\hss}}
  5207.  
  5208. \def\@downline{\hbox to \z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
  5209.    \@height \z@ \@depth \@linelen \hss}}
  5210.  
  5211. \def\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char'66}\raise
  5212.      \@linelen \hbox to\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}
  5213.  
  5214. \def\@downvector{\@downline\lower \@linelen
  5215.       \hbox to \z@{\@linefnt\char'77\hss}}
  5216.  
  5217. % \dashbox{D}(X,Y) ==
  5218. %  BEGIN
  5219. %  leave vertical mode
  5220. %  \hbox to 0pt {
  5221. %       \baselineskip := 0pt
  5222. %       \lineskip     := 0pt
  5223. %  %% HORIZONTAL DASHES
  5224. %       \@dashdim := X * \unitlength
  5225. %       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
  5226. %       \@dashdim := D * \unitlength
  5227. %       \@dashcnt := \@dashcnt / \@dashdim
  5228. %       if \@dashcnt is odd
  5229. %         then \@dashdim := 0pt
  5230. %              \@dashcnt := (\@dashcnt + 1) / 2
  5231. %         else \@dashdim := \@dashdim / 2
  5232. %              \@dashcnt := \@dashcnt / 2 - 1
  5233. %              \box\@dashbox   := \hbox{\vrule height \@halfwidth
  5234. %                                    depth \@halfwidth width \@dashdim}
  5235. %              \put(0,0){\copy\@dashbox}
  5236. %              \put(0,Y){\copy\@dashbox}
  5237. %              \put(X,0){\hskip -\@dashdim\copy\@dashbox}
  5238. %              \put(X,Y){\hskip -\@dashdim\box\@dashbox}
  5239. %              \@dashdim := 3 * \@dashdim
  5240. %       fi
  5241. %       \box\@dashbox := \hbox{\vrule height \@halfwidth
  5242. %                                 depth \@halfwidth width D * \unitlength
  5243. %                              \hskip D * \unitlength}
  5244. %       \@tempcnta := 0
  5245. %       \put(0,0){\hskip \@dashdim
  5246. %                while \@tempcnta < \@dascnt
  5247. %                  do \copy\@dashbox
  5248. %                     \@tempcnta := \@tempcnta + 1
  5249. %                  od
  5250. %               }
  5251. %       \@tempcnta := 0
  5252. %       put(0,Y){\hskip \@dashdim
  5253. %                while \@tempcnta < \@dascnt
  5254. %                  do \copy\@dashbox
  5255. %                     \@tempcnta := \@tempcnta + 1
  5256. %                  od
  5257. %               }
  5258. %
  5259. % %% vertical dashes
  5260. %       \@dashdim := Y * \unitlength
  5261. %       \@dashcnt := \@dashdim + 200 % to prevent roundoff error
  5262. %       \@dashdim := D * \unitlength
  5263. %       \@dashcnt := \@dashcnt / \@dashdim
  5264. %       if \@dashcnt is odd
  5265. %         then \@dashdim := 0pt
  5266. %              \@dashcnt := (\@dashcnt + 1) / 2
  5267. %         else \@dashdim := \@dashdim / 2
  5268. %              \@dashcnt := \@dashcnt / 2 - 1
  5269. %              \box\@dashbox   := \hbox{\hskip -\@halfwidth
  5270. %                                       \vrule width \@wholewidth
  5271. %                                                height \@dashdim  }
  5272. %              \put(0,0){\copy\@dashbox}
  5273. %              \put(X,0){\copy\@dashbox}
  5274. %              \put(0,Y){\lower\@dashdim\copy\@dashbox}
  5275. %              \put(X,Y){\lower\@dashdim\copy\@dashbox}
  5276. %              \@dashdim := 3 * \@dashdim
  5277. %       fi
  5278. %       \box\@dashbox := \hbox{\vrule width \@wholewidth
  5279. %                                 height D * \unitlength       }
  5280. %       \@tempcnta := 0
  5281. %       put(0,0){\hskip -\halfwidth
  5282. %                \vbox{while \@tempcnta < \@dashcnt
  5283. %                       do \vskip D*\unitlength
  5284. %                          \copy\@dashbox
  5285. %                          \@tempcnta := \@tempcnta + 1
  5286. %                       od
  5287. %                      \vskip \@dashdim
  5288. %                     } }
  5289. %       \@tempcnta := 0
  5290. %       put(X,0){\hskip -\halfwidth
  5291. %                \vbox{while \@tempcnta < \@dashcnt
  5292. %                       do \vskip D*\unitlength
  5293. %                          \copy\@dashbox
  5294. %                          \@tempcnta := \@tempcnta + 1
  5295. %                       od
  5296. %                      \vskip \@dashdim
  5297. %                     }
  5298. %               }
  5299. %    }     % END DASHES
  5300. %
  5301. %  \@imakepicbox(X,Y)
  5302. % END
  5303.  
  5304. \def\dashbox#1(#2,#3){\leavevmode\hbox to \z@{\baselineskip \z@%
  5305. \lineskip \z@%
  5306. \@dashdim=#2\unitlength%
  5307. \@dashcnt=\@dashdim \advance\@dashcnt 200
  5308. \@dashdim=#1\unitlength\divide\@dashcnt \@dashdim
  5309. \ifodd\@dashcnt\@dashdim=\z@%
  5310. \advance\@dashcnt \@ne \divide\@dashcnt \tw@
  5311. \else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
  5312. \advance\@dashcnt \m@ne
  5313. \setbox\@dashbox=\hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
  5314. \@width \@dashdim}\put(0,0){\copy\@dashbox}%
  5315. \put(0,#3){\copy\@dashbox}%
  5316. \put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
  5317. \put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
  5318. \multiply\@dashdim 3
  5319. \fi
  5320. \setbox\@dashbox=\hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
  5321. \@width #1\unitlength\hskip #1\unitlength}\@tempcnta=0
  5322. \put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
  5323. \do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta=0
  5324. \put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
  5325. \do{\copy\@dashbox\advance\@tempcnta \@ne }}%
  5326. \@dashdim=#3\unitlength%
  5327. \@dashcnt=\@dashdim \advance\@dashcnt 200
  5328. \@dashdim=#1\unitlength\divide\@dashcnt \@dashdim
  5329. \ifodd\@dashcnt \@dashdim=\z@%
  5330. \advance\@dashcnt \@ne \divide\@dashcnt \tw@
  5331. \else
  5332. \divide\@dashdim \tw@ \divide\@dashcnt \tw@
  5333. \advance\@dashcnt \m@ne
  5334. \setbox\@dashbox\hbox{\hskip -\@halfwidth
  5335. \vrule \@width \@wholewidth
  5336. \@height \@dashdim}\put(0,0){\copy\@dashbox}%
  5337. \put(#2,0){\copy\@dashbox}%
  5338. \put(0,#3){\lower\@dashdim\copy\@dashbox}%
  5339. \put(#2,#3){\lower\@dashdim\copy\@dashbox}%
  5340. \multiply\@dashdim 3
  5341. \fi
  5342. \setbox\@dashbox\hbox{\vrule \@width \@wholewidth
  5343. \@height #1\unitlength}\@tempcnta0
  5344. \put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta < \@dashcnt
  5345. \do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
  5346. \vskip\@dashdim}}\@tempcnta0
  5347. \put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta< \@dashcnt
  5348. \relax\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
  5349. \vskip\@dashdim}}}\@makepicbox(#2,#3)}
  5350.  
  5351. % CIRCLES AND OVALS
  5352. %
  5353. %  USER COMMANDS:
  5354. %
  5355. %  \circle{D} : Produces the circle with the diameter as close as
  5356. %               possible to D * \unitlength.  \put(X,Y){\circle{D}}
  5357. %               puts the circle with its center at (X,Y).
  5358. %
  5359. %  \oval(X,Y) : Makes an oval as round as possible that fits in the
  5360. %               rectangle of width X * \unitlength and height
  5361. %               Y * \unitlength. The reference point is the center.
  5362. %
  5363. % \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the
  5364. %                   half or quadrant of the oval indicated by POS.
  5365. %                   E.G., \oval(X,Y)[t] draws just the top half
  5366. %                   and \oval(X,Y)[br] draws just the bottom right
  5367. %                   quadrant.  In all cases, the reference point is
  5368. %                   the same as the unqualified \oval(X,Y) command.
  5369. %
  5370. % \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left side
  5371. %        or the right side of the oval being constructed.  The baseline
  5372. %        will coincide with the outside bottom edge of the oval; the left
  5373. %        side of the box will coincide with the left edge of the vertical
  5374. %        rule.  The width of the box will be \@tempdima.
  5375. %        DELTA1 and DELTA2 are added to the character number in \@tempcnta
  5376. %        to get the characters for the top and bottom quarter circle pieces.
  5377. %
  5378. % \@ovhorz : Makes an hbox containing the straight rule for either the
  5379. %         top or the bottom of the oval being constructed.  The baseline
  5380. %         will coincide with bottom edge of the rule; the left side of
  5381. %         the box will coincide with the left side of the oval.
  5382. %         The width of the box will be \@ovxx.
  5383. %
  5384. % \@getcirc {DIAM} : Sets \@tempcnta to the character number
  5385. %                   of the top-right quarter circle with the largest
  5386. %                   diameter less than or equal to DIAM.
  5387. %                   Sets \@tempboxa to an hbox containing that character.
  5388. %                   Sets \@tempdima to \wd \@tempboxa, which is the distance
  5389. %                   from the circle's left outside edge to its right
  5390. %                   inside edge.
  5391. %                   (These characters are like those described in the
  5392. %                   TeXbook, pp. 389-90.)
  5393. %
  5394. % \@getcirc {DIAM} ==
  5395. %   BEGIN
  5396. %     \@tempcnta       := integer coercion of (DIAM + 2pt)     %% + 2pt added
  5397. %     \@tempcnta       := \@tempcnta / integer coercion of 4pt %%    1 Nov 88
  5398. %     if \@tempcnta > 10
  5399. %       then \@tempcnta := 10 fi
  5400. %     if \@tempcnta > 0
  5401. %       then \@tempcnta := \@tempcnta-1
  5402. %       else LaTeX Warning: Oval too small.
  5403. %     fi
  5404. %     \@tempcnta       := 4 * \@tempcnta
  5405. %     \@tempboxa       := \hbox{\@circlefnt \char \@tempcnta}
  5406. %     \@tempdima       := \wd \@tempboxa
  5407. %   END
  5408. %
  5409. % \@put{X}{Y}{OBJ} ==
  5410. %   BEGIN
  5411. %     \raise Y \hbox to 0pt{\hskip X OBJ \hss}
  5412. %   END
  5413. %
  5414. % \@oval(X,Y)[POS] ==
  5415. %   BEGIN
  5416. %     \begingroup
  5417. %       \boxmaxdepth := \maxdimen
  5418. %       @ovt := @ovb := @ovl := @ovr := true
  5419. %       for all E in POS
  5420. %         do  @ovE := false od
  5421. %       \@ovxx      := X * \unitlength
  5422. %       \@ovyy      := Y * \unitlength
  5423. %       \@tempdimb := min(\@ovxx,\@ovyy)
  5424. %       \@getcirc{\@tempdimb-2pt}   %% "-2pt" added 7 Dec 89
  5425. %       \@ovro     := \ht \@tempboxa
  5426. %       \@ovri     := \dp \@tempboxa
  5427. %       \@ovdx     := \@ovxx - \@tempdima
  5428. %       \@ovdx     := \@ovdx/2
  5429. %       \@ovdy     := \@ovyy - \@tempdima
  5430. %       \@ovdy     := \@ovyy/2
  5431. %       \@circlefnt
  5432. %       \@tempboxa :=
  5433. %           \hbox{
  5434. %                 if @ovr
  5435. %                   then \@ovvert{3}{2} \kern -\@tempdima
  5436. %                 fi
  5437. %                 if @ovl
  5438. %                   then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima
  5439. %                        \kern -\@ovxx
  5440. %                 fi
  5441. %                 if @ovt
  5442. %                   then \@ovhorz \kern -\@ovxx
  5443. %                 fi
  5444. %                 if @ovb
  5445. %                   then \raise \@ovyy \@ovhorz
  5446. %                 fi
  5447. %                }
  5448. %       \@ovdx    := \@ovdx + \@ovro
  5449. %       \@ovdy    := \@ovdy + \@ovro
  5450. %      \ht\@tempboxa := \dp\@tempboxa := 0
  5451. %       \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}
  5452. %    \endgroup
  5453. %   END
  5454. %
  5455. % \@ovvert {DELTA1} {DELTA2} ==
  5456. %   BEGIN
  5457. %      \vbox to \@ovyy {
  5458. %                      if @ovb
  5459. %                        then \@tempcntb := \@tempcnta + DELTA1
  5460. %                             \kern -\@ovro
  5461. %                             \hbox { \char \@tempcntb }
  5462. %                             \nointerlineskip
  5463. %                        else \kern \@ovri \kern \@ovdy
  5464. %                      fi
  5465. %                      \leaders \vrule width \@wholewidth \vfil
  5466. %                      \nointerlineskip
  5467. %                      if @ovt
  5468. %                        then \@tempcntb := \@tempcnta + DELTA2
  5469. %                             \hbox { \char \@tempcntb }
  5470. %                        else \kern \@ovdy \kern \@ovro
  5471. %                      fi
  5472. %                     }
  5473. %   END
  5474. %
  5475. % \@ovhorz ==
  5476. %   BEGIN
  5477. %    \hbox to \@ovxx{
  5478. %                   \kern \@ovro
  5479. %                   if @ovr
  5480. %                     then
  5481. %                     else \kern \@ovdx
  5482. %                   fi
  5483. %                   \leaders \hrule height \@wholewidth \hfil
  5484. %                   if @ovl
  5485. %                     then
  5486. %                     else \kern \@ovdx
  5487. %                   fi
  5488. %                   \kern \@ovri
  5489. %                  }
  5490. %   END
  5491. %
  5492. % \circle{DIAM} ==
  5493. %   BEGIN
  5494. %    \begingroup
  5495. %    \boxmaxdepth := maxdimen
  5496. %    \@tempdimb := DIAM *\unitlength
  5497. %    if \@tempdimb > 15.5pt
  5498. %      then \@getcirc{\@tempdimb}
  5499. %           \@ovro := \ht \@tempboxa
  5500. %           \@tempboxa := \hbox{
  5501. %                   \@circlefnt
  5502. %                   \@tempcnta := \@tempcnta + 2
  5503. %                   \char \@tempcnta
  5504. %                   \@tempcnta := \@tempcnta - 1
  5505. %                   \char \@tempcnta
  5506. %                   \kern -2\@tempdima
  5507. %                   \@tempcnta := \@tempcnta + 2
  5508. %                   \raise \@tempdima \hbox { \char \@tempcnta }
  5509. %                   \raise \@tempdima \box\@tempboxa
  5510. %                  }
  5511. %           \ht\@tempboxa := \dp\@tempboxa := 0
  5512. %           \@put{-\@ovro}{-\@ovro}{\@tempboxa}
  5513. %      else
  5514. %           \@circ{\@tempdimb}{96}
  5515. %    fi
  5516. %   \endgroup
  5517. %   END
  5518. %
  5519. % \circle*{DIAM}  ==  \@dot{DIAM} == \@circ{DIAM*\unitlength}{112}
  5520. %
  5521. % \@circ{DIAM}{CHAR} ==
  5522. %  BEGIN
  5523. %   \@tempcnta := integer coercion of (DIAM + .5pt)/1pt.
  5524. %   if \@tempcnta > 15 then \@tempcnta := 15 fi
  5525. %   if \@tempcnta > 1  then \@tempcnta := \@tempcnta - 1 fi
  5526. %   \@tempcnta := \@tempcnta + CHAR
  5527. %   \@circlefnt
  5528. %   \char \@tempcnta
  5529. %  END
  5530. %
  5531.  
  5532. \newif\if@ovt
  5533. \newif\if@ovb
  5534. \newif\if@ovl
  5535. \newif\if@ovr
  5536. \newdimen\@ovxx
  5537. \newdimen\@ovyy
  5538. \newdimen\@ovdx
  5539. \newdimen\@ovdy
  5540. \newdimen\@ovro
  5541. \newdimen\@ovri
  5542.  
  5543. %% \advance\@tempdima 2pt\relax added 1 Nov 88 to fix bug in which
  5544. %% size of drawn circle not monotonic function of argument of \circle,
  5545. %% caused by different rounding for dimensions of large and small circles.
  5546. %
  5547. \def\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2pt\relax
  5548.   \@tempcnta\@tempdima
  5549.   \@tempdima 4pt\relax \divide\@tempcnta\@tempdima
  5550.   \ifnum \@tempcnta > 10\relax \@tempcnta 10\relax\fi
  5551.   \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne
  5552.     \else \@warning{Oval too small}\fi
  5553.   \multiply\@tempcnta 4\relax
  5554.   \setbox \@tempboxa \hbox{\@circlefnt
  5555.   \char \@tempcnta}\@tempdima \wd \@tempboxa}
  5556.  
  5557. \def\@put#1#2#3{\raise #2\hbox to \z@{\hskip #1#3\hss}}
  5558.  
  5559. \def\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}
  5560.  
  5561. \def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
  5562.   \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
  5563.   \@tfor\@tempa :=#3\do{\csname @ov\@tempa false\endcsname}\@ovxx
  5564.   #1\unitlength \@ovyy #2\unitlength
  5565.   \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
  5566.   \advance \@tempdimb -2pt\relax  %%%% added 7 Dec 89
  5567.   \@getcirc \@tempdimb
  5568.   \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
  5569.   \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
  5570.   \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
  5571.   \@circlefnt \setbox\@tempboxa
  5572.   \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
  5573.   \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi
  5574.   \if@ovt \@ovhorz \kern -\@ovxx \fi
  5575.   \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
  5576.   \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
  5577.   \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
  5578.   \endgroup}
  5579.  
  5580. \def\@ovvert#1#2{\vbox to \@ovyy{%
  5581.     \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb by #1\relax
  5582.       \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
  5583.     \else \kern \@ovri \kern \@ovdy \fi
  5584.     \leaders\vrule width \@wholewidth\vfil \nointerlineskip
  5585.     \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb by #2\relax
  5586.       \hbox{\char \@tempcntb}%
  5587.     \else \kern \@ovdy \kern \@ovro \fi}}
  5588.  
  5589. \def\@ovhorz{\hbox to \@ovxx{\kern \@ovro
  5590.     \if@ovr \else \kern \@ovdx \fi
  5591.     \leaders \hrule height \@wholewidth \hfil
  5592.     \if@ovl \else \kern \@ovdx \fi
  5593.     \kern \@ovri}}
  5594.  
  5595. \def\circle{\@ifstar{\@dot}{\@circle}}
  5596. \def\@circle#1{\begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
  5597.    \ifdim \@tempdimb >15.5pt\relax \@getcirc\@tempdimb
  5598.       \@ovro\ht\@tempboxa
  5599.      \setbox\@tempboxa\hbox{\@circlefnt
  5600.       \advance\@tempcnta\tw@ \char \@tempcnta
  5601.       \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima
  5602.       \advance\@tempcnta\tw@
  5603.       \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima
  5604.         \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
  5605.       \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
  5606.    \else  \@circ\@tempdimb{96}\fi\endgroup}
  5607.  
  5608. \def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
  5609.  
  5610. \def\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5pt\relax
  5611.    \@tempcnta\@tempdima \@tempdima 1pt\relax
  5612.    \divide\@tempcnta\@tempdima
  5613.    \ifnum\@tempcnta > 15\relax \@tempcnta 15\relax \fi
  5614.    \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi
  5615.    \advance\@tempcnta #2\relax
  5616.    \@circlefnt \char\@tempcnta}
  5617.  
  5618.  
  5619. %INITIALIZATION
  5620. \thinlines
  5621.  
  5622. \newcount\@xarg
  5623. \newcount\@yarg
  5624. \newcount\@yyarg
  5625. \newcount\@multicnt
  5626. \newdimen\@xdim
  5627. \newdimen\@ydim
  5628. \newbox\@linechar
  5629. \newdimen\@linelen
  5630. \newdimen\@clnwd
  5631. \newdimen\@clnht
  5632. \newdimen\@dashdim
  5633. \newbox\@dashbox
  5634. \newcount\@dashcnt
  5635.  
  5636.  
  5637.  
  5638.  \message{theorem,}
  5639. %       ****************************************
  5640. %       *         THEOREM ENVIRONMENTS         *
  5641. %       ****************************************
  5642. %
  5643. %  The user creates his own theorem-like environments with the command
  5644. %      \newtheorem{NAME}{TEXT}[COUNTER]  or
  5645. %      \newtheorem{NAME}[OLDNAME]{TEXT}
  5646. %  This defines the environment NAME to be just as one would expect a
  5647. %  theorem environment to be, except that it prints ``TEXT'' instead of
  5648. %  ``Theorem''.
  5649. %
  5650. %  If OLDNAME is given, then environments NAME and OLDNAME use the same
  5651. %  counter, so using a NAME environment advances the number of the next
  5652. %  NAME environment, and vice-versa.
  5653. %
  5654. %  If COUNTER is given, then environment NAME is numbered within COUNTER.
  5655. %  E.g., if COUNTER = subsection, then the first NAME in subsection 7.2
  5656. %  is numbered TEXT 7.2.1.
  5657. %
  5658. %  The way NAME environments are numbered can be changed by redefining
  5659. %  \theNAME.
  5660. %
  5661. %  DOCUMENT STYLE PARAMETERS
  5662. %
  5663. %  \@thmcounter{COUNTER} : A command such that
  5664. %               \edef\theCOUNTER{\@thmcounter{COUNTER}}
  5665. %         defines \theCOUNTER to produce a number for a theorem environment.
  5666. %         The default is:
  5667. %            BEGIN \noexpand\arabic{COUNTER} END
  5668. %
  5669. %  \@thmcountersep : A separator placed between a theorem number and
  5670. %         the number of the counter within which it is numbered.
  5671. %         E.g., to make the third theorem of section 7.2 be numbered
  5672. %         7.2-3, \@thmcountersep should be \def'ed to '-'.  Its
  5673. %         default is '.'.
  5674. %
  5675. %  \@begintheorem{NAME}{NUMBER} : A command that begins a theorem
  5676. %         environment for a 'theorem' named 'NAME NUMBER' --
  5677. %         e.g., \@begintheorem{Lemma}{3.7} starts Lemma 3.7.
  5678. %
  5679. %  \@opargbegintheorem{NAME}{NUMBER}{OPARG} : A command that begins a theorem
  5680. %         environment for a 'theorem' named 'NAME NUMBER' with optional
  5681. %         argument OPARG -- e.g., \@begintheorem{Lemma}{3.7}{Jones}
  5682. %         starts `Lemma 3.7 (Jones):'.
  5683. %
  5684. %  \@endtheorem : A command that ends a theorem environment.
  5685. %
  5686. % \newtheorem{NAME}{TEXT}[COUNTER] ==
  5687. %   BEGIN
  5688. %     if \NAME is definable
  5689. %       then \@definecounter{NAME}
  5690. %            if COUNTER present
  5691. %              then \@addtoreset{NAME}{COUNTER} fi
  5692. %                   \theNAME ==  BEGIN \theCOUNTER \@thmcountersep
  5693. %                                       eval\@thmcounter{NAME}      END
  5694. %              else \theNAME ==  BEGIN eval\@thmcounter{NAME} END
  5695. %            \NAME == \@thm{NAME}{TEXT}
  5696. %            \endNAME == \@endtheorem
  5697. %       else  error
  5698. %     fi
  5699. %   END
  5700. %
  5701. % \newtheorem{NAME}[OLDNAME]{TEXT}==
  5702. %   BEGIN
  5703. %     if \NAME is definable
  5704. %       then \theNAME == \theOLDNAME
  5705. %            \NAME == \@thm{OLDNAME}{TEXT}
  5706. %            \endNAME == \@endtheorem
  5707. %       else  error
  5708. %     fi
  5709. %   END
  5710. %
  5711. % \@thm{NAME}{TEXT} ==
  5712. %   BEGIN
  5713. %    \refstepcounter{NAME}
  5714. %    if next char = [
  5715. %       then \@ythm{NAME}{TEXT}
  5716. %       else \@xthm{NAME}{TEXT}
  5717. %    fi
  5718. %   END
  5719. %
  5720. % \@xthm{NAME}{TEXT} ==
  5721. %   BEGIN
  5722. %    \@begintheorem{TEXT}{\theNAME}
  5723. %    \ignorespaces
  5724. %   END
  5725. %
  5726. % \@ythm{NAME}{TEXT}[OPARG] ==
  5727. %   BEGIN
  5728. %    \@opargbegintheorem{TEXT}{\theNAME}{OPARG}
  5729. %    \ignorespaces
  5730. %   END
  5731. %
  5732. \def\newtheorem#1{\@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}
  5733.  
  5734. \def\@nthm#1#2{%
  5735. \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}}
  5736.  
  5737. \def\@xnthm#1#2[#3]{\expandafter\@ifdefinable\csname #1\endcsname
  5738. {\@definecounter{#1}\@addtoreset{#1}{#3}%
  5739. \expandafter\xdef\csname the#1\endcsname{\expandafter\noexpand
  5740.   \csname the#3\endcsname \@thmcountersep \@thmcounter{#1}}%
  5741. \global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}}
  5742.  
  5743. \def\@ynthm#1#2{\expandafter\@ifdefinable\csname #1\endcsname
  5744. {\@definecounter{#1}%
  5745. \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
  5746. \global\@namedef{#1}{\@thm{#1}{#2}}\global\@namedef{end#1}{\@endtheorem}}}
  5747.  
  5748. \def\@othm#1[#2]#3{\expandafter\@ifdefinable\csname #1\endcsname
  5749.   {\global\@namedef{the#1}{\@nameuse{the#2}}%
  5750. \global\@namedef{#1}{\@thm{#2}{#3}}%
  5751. \global\@namedef{end#1}{\@endtheorem}}}
  5752.  
  5753. \def\@thm#1#2{\refstepcounter
  5754.     {#1}\@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}}
  5755.  
  5756. \def\@xthm#1#2{\@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces}
  5757. \def\@ythm#1#2[#3]{\@opargbegintheorem{#2}{\csname
  5758.        the#1\endcsname}{#3}\ignorespaces}
  5759.  
  5760. %DEFAULT VALUES
  5761. \def\@thmcounter#1{\noexpand\arabic{#1}}
  5762. \def\@thmcountersep{.}
  5763. %deleted September 2, 1986 MDK
  5764. %\def\@makethmnumber#1#2{\bf #1 #2:}
  5765. \def\@begintheorem#1#2{\it \trivlist \item[\hskip \labelsep{\bf #1\ #2}]}
  5766. \def\@opargbegintheorem#1#2#3{\it \trivlist
  5767.       \item[\hskip \labelsep{\bf #1\ #2\ (#3)}]}
  5768. \def\@endtheorem{\endtrivlist}
  5769.  
  5770.  
  5771.  \message{lengths,}
  5772. %     ****************************************
  5773. %     *              LENGTHS                 *
  5774. %     ****************************************
  5775. %
  5776. % USER COMMANDS:
  5777. %
  5778. %   \newlength{\NAME}          == \newskip\NAME
  5779. %   \setlength{\NAME}{VALUE}   == \NAME :=L VALUE
  5780. %   \addtolength{\NAME}{VALUE} == \NAME :=L \NAME + VALUE
  5781. %   \settowidth{\NAME}{TEXT}   == \NAME :=L width of \hbox{TEXT}
  5782. %
  5783. \def\newlength#1{\@ifdefinable#1{\newskip#1}}
  5784. \def\setlength#1#2{#1#2\relax}
  5785. \def\addtolength#1#2{\advance#1 #2\relax}
  5786. \def\settowidth#1#2{\setbox\@tempboxa\hbox{#2}#1\wd\@tempboxa\relax}
  5787.    %% \relax added 24 Mar 86
  5788.  
  5789.  \message{title,}
  5790. %     *****************************************
  5791. %     *              THE TITLE                *
  5792. %     *****************************************
  5793. %
  5794. % The user defines the title, author, date by the declarations \title{NAME},
  5795. % \author{NAME} and \date{DATE}.  Inside these, he can use the \thanks
  5796. % command to make footnoted acknowledgements, notice of address, etc.
  5797. % The \maketitle command produces the actual title.  Note: multiple authors
  5798. % are separated with the \and command.
  5799.  
  5800. \def\title#1{\gdef\@title{#1}}
  5801.  
  5802. \def\author#1{\gdef\@author{#1}}
  5803.  
  5804. \def\date#1{\gdef\@date{#1}}
  5805. \gdef\@date{\today}          %Default is today's date
  5806.  
  5807. \def\thanks#1{\footnotemark\begingroup
  5808. \def\protect{\noexpand\protect\noexpand}\xdef\@thanks{\@thanks
  5809.   \protect\footnotetext[\the\c@footnote]{#1}}\endgroup}
  5810.  
  5811. \def\@thanks{}
  5812.  
  5813. \def\and{%%                             % \begin{tabular}
  5814. \end{tabular}\hskip 1em plus .17fil\begin{tabular}[t]{c}%% \end{tabular}
  5815. }
  5816.  
  5817.  
  5818.  
  5819.  \message{sectioning,}
  5820. %     *****************************************
  5821. %     *              SECTIONING               *
  5822. %     *****************************************
  5823. %
  5824. %
  5825. % \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}
  5826. %            optional * [ALTHEADING]{HEADING}
  5827. %    Generic command to start a section.
  5828. %    NAME       : e.g., 'subsection'
  5829. %    LEVEL      : a number, denoting depth of section -- e.g., chapter=1,
  5830. %                 section = 2, etc.
  5831. %    INDENT     : Indentation of heading from left margin
  5832. %    BEFORESKIP : Absolute value = skip to leave above the heading.
  5833. %                 If negative, then paragraph indent of text following
  5834. %                 heading is suppressed.
  5835. %    AFTERSKIP  : if positive, then skip to leave below heading, else
  5836. %                 negative of skip to leave to right of run-in heading.
  5837. %    STYLE      : commands to set style
  5838. %  If '*' missing, then increments the counter.  If it is present, then
  5839. %  there should be no [ALTHEADING] argument.
  5840. %  Uses the counter 'secnumdepth' whose value is the highest section
  5841. %  level that is to be numbered.
  5842. %
  5843. %  WARNING: The \@startsection command should be at the same or higher
  5844. %  grouping level as the text that follows it.  For example, you
  5845. %  should NOT do something like
  5846. %      \def\foo{ \begingroup ...
  5847. %                   \paragraph{...}
  5848. %                 \endgroup}
  5849. %
  5850. % \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} ==
  5851. %    BEGIN
  5852. %     IF  @noskipsec = T  THEN  \leavevmode  FI  % true if previous section
  5853. %                                                % had no body.
  5854. %     \par
  5855. %     \@tempskipa  := BEFORESKIP
  5856. %     @afterindent := T
  5857. %     IF \@tempskipa < 0  THEN  \@tempskipa  := -\@tempskipa
  5858. %                               @afterindent := F
  5859. %     FI
  5860. %     IF @nobreak = true
  5861. %       THEN \everypar == null
  5862. %       ELSE \addpenalty{\@secpenalty}
  5863. %            \addvspace{\@tempskipa}
  5864. %     FI
  5865. %     IF * next
  5866. %       THEN \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}
  5867. %       ELSE \@dblarg{\@sect
  5868. %                       {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}}
  5869. %     FI
  5870. % END
  5871. %
  5872. % \@sect{NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}[ARG1]{ARG2} ==
  5873. %   BEGIN
  5874. %    IF LEVEL > \c@secnumdepth
  5875. %      THEN \@svsec :=L null
  5876. %      ELSE \refstepcounter{NAME}
  5877. %           \@svsec :=L BEGIN \theNAME END
  5878. %    FI
  5879. %    IF AFTERSKIP > 0
  5880. %      THEN \begingroup
  5881. %              STYLE
  5882. %              \@hangfrom{\hskip INDENT\@svsec}
  5883. %              {\interlinepenalty 10000 ARG2\par}
  5884. %           \endgroup
  5885. %           \NAMEmark{ARG1}
  5886. %           \addcontentsline{toc}{NAME}
  5887. %              { IF  LEVEL > \c@secnumdepth
  5888. %                  ELSE \protect\numberline{\theNAME}  FI
  5889. %                ARG1 }
  5890. %      ELSE \@svsechd == BEGIN  STYLE
  5891. %                               \hskip INDENT\@svsec
  5892. %                               ARG2
  5893. %                               \NAMEmark{ARG1}
  5894. %                               \addcontentsline{toc}{NAME}
  5895. %                                  { IF  LEVEL > \c@secnumdepth
  5896. %                                      ELSE \protect\numberline{\theNAME}  FI
  5897. %                                    ARG1 }
  5898. %                        END
  5899. %    FI
  5900. %    \@xsect{AFTERSKIP}
  5901. % END
  5902. %
  5903. % \@xsect{AFTERSKIP} ==
  5904. %  BEGIN
  5905. %    IF AFTERSKIP > 0
  5906. %      THEN \par \nobreak
  5907. %           \vskip AFTERSKIP
  5908. %           \@afterheading
  5909. %      ELSE @nobreak :=G F
  5910. %           @noskipsec :=G T
  5911. %           \everypar{ IF @noskipsec = T
  5912. %                        THEN @noskipsec :=G F
  5913. %                             \clubpenalty :=G 10000
  5914. %                             \hskip -\parindent
  5915. %                             \begingroup
  5916. %                               \@svsechd
  5917. %                             \endgroup
  5918. %                             \unskip
  5919. %                             \hskip -AFTERSKIP
  5920. %                        ELSE \clubpenalty :=G \@clubpenalty
  5921. %                             \everypar := NULL
  5922. %                      FI
  5923. %                    }
  5924. %    FI
  5925. %
  5926. %   END
  5927. %
  5928. % \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}{ARG} ==
  5929. %   BEGIN
  5930. %    IF AFTERSKIP > 0
  5931. %      THEN \begingroup
  5932. %             STYLE
  5933. %             \@hangfrom{\hskip INDENT}{\interlinepenalty 10000 ARG\par}
  5934. %           \endgroup
  5935. %      ELSE \@svsechd == BEGIN STYLE
  5936. %                              \hskip INDENT
  5937. %                              ARG
  5938. %                        END
  5939. %    FI
  5940. %    \@xsect{AFTERSKIP}
  5941. %   END
  5942. %
  5943. % \@afterheading ==
  5944. %  BEGIN
  5945. %    @nobreak :=G true
  5946. %    \everypar := BEGIN  IF @nobreak = T
  5947. %                          THEN @nobreak  :=G false
  5948. %                               \clubpenalty :=G 10000
  5949. %                               IF @afterindent = F
  5950. %                                 THEN remove \lastbox
  5951. %                               FI
  5952. %                          ELSE \clubpenalty :=G \@clubpenalty
  5953. %                               \everypar := NULL
  5954. %                       FI
  5955. %                 END
  5956. %  END
  5957. %
  5958. % \@secpenalty : The penalty (usually negative) put before a section
  5959. %                heading unless it immediately follows another one.
  5960. %
  5961. \newcount\@secpenalty
  5962. \@secpenalty = -300
  5963.  
  5964.  
  5965. \newif\if@noskipsec  \@noskipsecfalse
  5966.  
  5967. \def\@startsection#1#2#3#4#5#6{\if@noskipsec \leavevmode \fi
  5968.    \par \@tempskipa #4\relax
  5969.    \@afterindenttrue
  5970.    \ifdim \@tempskipa <\z@ \@tempskipa -\@tempskipa \@afterindentfalse\fi
  5971.    \if@nobreak \everypar{}\else
  5972.      \addpenalty{\@secpenalty}\addvspace{\@tempskipa}\fi \@ifstar
  5973.      {\@ssect{#3}{#4}{#5}{#6}}{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
  5974.  
  5975. \def\@sect#1#2#3#4#5#6[#7]#8{\ifnum #2>\c@secnumdepth
  5976.      \def\@svsec{}\else
  5977.      \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname\hskip 1em }\fi
  5978.      \@tempskipa #5\relax
  5979.       \ifdim \@tempskipa>\z@
  5980.         \begingroup #6\relax
  5981.           \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\par}%
  5982.         \endgroup
  5983.        \csname #1mark\endcsname{#7}\addcontentsline
  5984.          {toc}{#1}{\ifnum #2>\c@secnumdepth \else
  5985.                       \protect\numberline{\csname the#1\endcsname}\fi
  5986.                     #7}\else
  5987.         \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname
  5988.                       {#7}\addcontentsline
  5989.                            {toc}{#1}{\ifnum #2>\c@secnumdepth \else
  5990.                              \protect\numberline{\csname the#1\endcsname}\fi
  5991.                        #7}}\fi
  5992.      \@xsect{#5}}
  5993.  
  5994. \def\@xsect#1{\@tempskipa #1\relax
  5995.       \ifdim \@tempskipa>\z@
  5996.        \par \nobreak
  5997.        \vskip \@tempskipa
  5998.        \@afterheading
  5999.     \else \global\@nobreakfalse \global\@noskipsectrue
  6000.        \everypar{\if@noskipsec \global\@noskipsecfalse
  6001.                    \clubpenalty\@M \hskip -\parindent
  6002.                    \begingroup \@svsechd \endgroup \unskip
  6003.                    \hskip -#1
  6004.                   \else \clubpenalty \@clubpenalty
  6005.                     \everypar{}\fi}\fi\ignorespaces}
  6006.  
  6007. \def\@ssect#1#2#3#4#5{\@tempskipa #3\relax
  6008.    \ifdim \@tempskipa>\z@
  6009.      \begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup
  6010.    \else \def\@svsechd{#4\hskip #1\relax #5}\fi
  6011.     \@xsect{#3}}
  6012.  
  6013. \newif\if@afterindent \@afterindenttrue
  6014.  
  6015. \def\@afterheading{\global\@nobreaktrue
  6016.       \everypar{\if@nobreak
  6017.                    \global\@nobreakfalse
  6018.                    \clubpenalty \@M
  6019.                    \if@afterindent \else {\setbox0=\lastbox}\fi
  6020.                  \else \clubpenalty \@clubpenalty
  6021.                     \everypar{}\fi}}
  6022.  
  6023.  
  6024. % \@hangfrom{TEXT} : Puts TEXT in a box, and makes a hanging indentation
  6025. %    of the following material up to the first \par.  Should be used
  6026. %    in vertical mode.
  6027. %
  6028. \def\@hangfrom#1{\setbox\@tempboxa=\hbox{#1}%
  6029.       \hangindent 1\wd\@tempboxa\noindent\box\@tempboxa}
  6030.  
  6031. \newcount\c@secnumdepth
  6032. \newcount\c@tocdepth
  6033.  
  6034. % \secdef{UNSTARCMDS}{STARCMDS} :
  6035. %    When defining a \chapter or \section command without using
  6036. %    \@startsection, you can use \secdef as follows:
  6037. %       \def\chapter { ... \secdef \CMDA \CMDB }
  6038. %       \def\CMDA    [#1]#2{ ... }  % Command to define \chapter[...]{...}
  6039. %       \def\CMDB    #1{ ... }      % Command to define \chapter*{...}
  6040.  
  6041. \def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}}
  6042.  
  6043. % Initializations
  6044. %
  6045. \def\sectionmark#1{}
  6046. \def\subsectionmark#1{}
  6047. \def\subsubsectionmark#1{}
  6048. \def\paragraphmark#1{}
  6049. \def\subparagraphmark#1{}
  6050.  
  6051.  \message{contents,}
  6052. %     *****************************************
  6053. %     *        TABLE OF CONTENTS, ETC.        *
  6054. %     *****************************************
  6055. %
  6056. % CONVENTIONS:
  6057. %   \tf@foo = file number for output for table foo.  The file is
  6058. %             opened only if @filesw = true.
  6059. %
  6060. %   \contentsline{TYPE}{ENTRY}{PAGE}
  6061. %       Macro to produce a TYPE entry in a table of contents, etc.
  6062. %       It will appear in the .TOC or other file.  For example,
  6063. %       The entry for subsection 1.4.3 in the table of contents might
  6064. %       be produced by:
  6065. %       \contentsline{subsection}{\makebox{30pt}[r]{1.4.3} Gnats and Gnus}{22}
  6066. %       The \protect command causes command sequences to be written
  6067. %       without expanding them.
  6068. %
  6069. %   \l@TYPE{ENTRY}{PAGE}
  6070. %       Macro defined by document style for making an entry of
  6071. %       type TYPE in a table of contents, etc.  E.g., the document
  6072. %       style should define \l@chapter, \l@section, etc.
  6073. %
  6074. %   \addcontentsline{TABLE}{TYPE}{ENTRY}
  6075. %      User command for adding his own entry to a table of contents, etc.
  6076. %      It adds the entry
  6077. %         \contentsline{TYPE}{ENTRY}{page}
  6078. %      to the .TABLE file.
  6079. %
  6080. %   \addtocontents{TABLE}{TEXT} : Adds TEXT to the .TABLE file, with no
  6081. %      page number.
  6082. %
  6083. %  Note: When used in the ENTRY or TEXT of one of the above commands,
  6084. %  \protect causes the following control sequence to be written
  6085. %  on the file without being expanded.  The sequence will be expanded
  6086. %  when the table of contents entry is processed.
  6087. %
  6088. %  SURPRISE: \index, \glossary,  and \label are no-ops inside an
  6089. %  \addcontentsline or \addtocontents command argument.  This could cause a
  6090. %  problem if the user puts an \index or \label into one of the commands he
  6091. %  writes, or into the optional 'short version' argument of a \section or
  6092. %  \caption command.
  6093. %
  6094. % \addcontentsline{TABLE}{TYPE}{ENTRY}  ==
  6095. %   BEGIN
  6096. %     if @filesw = true
  6097. %       then  \begingroup
  6098. %               \index == \label == \glossary == \@gobble
  6099. %               \protect{ARG} == \string\string\string ARG \string\space\space
  6100. %               \@temptokena := \thepage
  6101. %               \@tempa  == write \string\contentsline
  6102. %                              {TYPE}{ENTRY}{\the\@temptokena}
  6103. %               \@tempa
  6104. %               IF vmode and @nobreak = true  THEN  \nobreak FI
  6105. %              \endgroup
  6106. %     fi
  6107. %   END
  6108. %
  6109. % \@starttoc{EXT} : Used to define \tableofcontents, \listoffigures, etc.--
  6110. %      e.g., \@starttoc{lof} is used in \listoffigures.  This command reads
  6111. %      the .EXT file and sets up to write the new .EXT file.
  6112. %
  6113. % \@starttoc{EXT} ==
  6114. %   BEGIN
  6115. %     \begingroup
  6116. %        \makeatletter
  6117. %        read file \jobname.EXT
  6118. %        IF @filesw = true
  6119. %          THEN  open \jobname.EXT as file \tf@EXT
  6120. %        FI
  6121. %        @nobreak :=G FALSE  %% added 24 May 89
  6122. %     \endgroup
  6123. %   END
  6124.  
  6125. \def\@starttoc#1{\begingroup
  6126.   \makeatletter
  6127.   \@input{\jobname.#1}\if@filesw \expandafter\newwrite\csname tf@#1\endcsname
  6128.              \expandafter\openout \csname tf@#1\endcsname \jobname.#1\relax
  6129.   \fi \global\@nobreakfalse \endgroup}
  6130.  
  6131.  
  6132. \let\protect=\relax
  6133.  
  6134. \def\addcontentsline#1#2#3{\if@filesw \begingroup
  6135. \let\label\@gobble \let\index\@gobble \let\glossary\@gobble
  6136. \def\protect##1{\string\string\string##1\string\space
  6137.    \space}\@temptokena{\thepage}%
  6138. \edef\@tempa{\write \@auxout{\string\@writefile{#1}{\protect
  6139.      \contentsline{#2}{#3}{\the\@temptokena}}}}\@tempa
  6140.    \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi}
  6141.  
  6142. \long\def\addtocontents#1#2{\if@filesw \begingroup
  6143. \let\label\@gobble \let\index\@gobble \let\glossary\@gobble
  6144. \def\protect##1{\string\string\string##1\string\space\space}%
  6145. \edef\@tempa{\write \@auxout {\string\@writefile{#1}{#2}}}\@tempa
  6146.   \if@nobreak \ifvmode\nobreak\fi\fi\endgroup\fi}
  6147.  
  6148. \def\contentsline#1{\csname l@#1\endcsname}
  6149.  
  6150. % \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH}{TITLE}{PAGE} :
  6151. %   Macro to produce a table of contents line with the following
  6152. %   parameters:
  6153. %     LEVEL    : If LEVEL > \c@tocdepth, then no line produced.
  6154. %     INDENT   : Total indentation from the left margin.
  6155. %     NUMWIDTH : Width of box for number if the TITLE has a
  6156. %                \numberline command.
  6157. %                As of 25 Jan 88, this is also the amount of extra indentation
  6158. %                added to second and later lines of a multiple line entry.
  6159. %     TITLE    : Contents of entry.
  6160. %     PAGE     : Page number.
  6161. %
  6162. %  Uses the following parameters, which must be set by the document style.
  6163. %  They should be defined with \def's.
  6164. %    \@pnumwidth : Width of box in which page number is set.
  6165. %    \@tocrmarg  : Right margin indentation for all but last line of
  6166. %                  multiple-line entries.
  6167. %    \@dotsep    : Separation between dots, in mu units.  Should be \def'd to
  6168. %                  a number like 2 or 1.7
  6169. %
  6170.  
  6171. \def\@dottedtocline#1#2#3#4#5{\ifnum #1>\c@tocdepth \else
  6172.   \vskip \z@ plus .2pt
  6173.   {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
  6174.     \parindent #2\relax\@afterindenttrue
  6175.    \interlinepenalty\@M
  6176.    \leavevmode
  6177.    \@tempdima #3\relax \advance\leftskip \@tempdima \hbox{}\hskip -\leftskip
  6178.     #4\nobreak\leaders\hbox{$\m@th \mkern \@dotsep mu.\mkern \@dotsep
  6179.        mu$}\hfill \nobreak \hbox to\@pnumwidth{\hfil\rm #5}\par}\fi}
  6180.  
  6181.  
  6182. %%% Note: \nobreak's added 7 Jan 86 to prevent bad line break that
  6183. %%% left the page number dangling by itself at left edge of a new line.
  6184. %%%
  6185. %%% Changed 25 Jan 88 to use \leftskip instead of \hangindent so
  6186. %%% leaders of multiple-line contents entries would line up properly.
  6187.  
  6188. % \numberline{NUMBER} : For use in a \contentsline command.
  6189. %   It puts NUMBER flushleft in a box of width \@tempdima
  6190. %   (Before 25 Jan 88 change, it also added \@tempdima to the hanging
  6191. %   indentation.)
  6192.  
  6193. \def\numberline#1{\hbox to\@tempdima{#1\hfil}}
  6194.  
  6195.  
  6196.  \message{index,}
  6197. %       ****************************************************
  6198. %       *            INDEX COMMANDS AND GLOSSARY           *
  6199. %       ****************************************************
  6200. %
  6201. % \makeindex ==
  6202. %   BEGIN
  6203. %    if \@filesw = T
  6204. %      then  open file \jobname.IDX as \@indexfile
  6205. %             \index ==  BEGIN \@bsphack
  6206. %                              \begingroup
  6207. %                                 \protect{X} == \string X\space
  6208. %                                       %% added 3 Feb 87 for \index commands
  6209. %                                       %% in \footnotes
  6210. %                                  re-\catcode special characters to 'other'
  6211. %                                  \@wrindex
  6212. %    fi
  6213. %   END
  6214. %
  6215. %  \@wrindex{ITEM} ==
  6216. %    BEGIN
  6217. %        write of {\indexentry{ITEM}{page number}}
  6218. %      \endgroup
  6219. %      \@esphack
  6220. %    END
  6221.  
  6222. %  INITIALIZATION:
  6223. %
  6224. %  \index == BEGIN \@bsphack
  6225. %                  \begingroup
  6226. %                     re-\catcode special characters (in case '%' there)
  6227. %                     \@index
  6228. %            END
  6229. %
  6230. %  \@index{ITEM} == BEGIN \endgroup \@esphack END
  6231. %
  6232. % Changes made 14 Apr 89 to write \glossaryentry's instead of
  6233. % \indexentry's on the .glo file.
  6234.  
  6235. \def\makeindex{\if@filesw \newwrite\@indexfile
  6236.   \immediate\openout\@indexfile=\jobname.idx
  6237.   \def\index{\@bsphack\begingroup
  6238.              \def\protect####1{\string####1\space}\@sanitize
  6239.              \@wrindex}\typeout
  6240.   {Writing index file \jobname.idx }\fi}
  6241.  
  6242. \def\@wrindex#1{\let\thepage\relax
  6243.    \xdef\@gtempa{\write\@indexfile{\string
  6244.       \indexentry{#1}{\thepage}}}\endgroup\@gtempa
  6245.    \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
  6246.  
  6247. \def\index{\@bsphack\begingroup \@sanitize\@index}
  6248.  
  6249. \def\@index#1{\endgroup\@esphack}
  6250.  
  6251. \def\makeglossary{\if@filesw \newwrite\@glossaryfile
  6252.   \immediate\openout\@glossaryfile=\jobname.glo
  6253.   \def\glossary{\@bsphack\begingroup\@sanitize\@wrglossary}\typeout
  6254.   {Writing glossary file \jobname.glo }\fi}
  6255.  
  6256. \def\@wrglossary#1{\let\thepage\relax
  6257.    \xdef\@gtempa{\write\@glossaryfile{\string
  6258.       \glossaryentry{#1}{\thepage}}}\endgroup\@gtempa
  6259.    \if@nobreak \ifvmode\nobreak\fi\fi\@esphack}
  6260.  
  6261. \def\glossary{\@bsphack\begingroup\@sanitize\@index}
  6262.  
  6263.  \message{bibliography,}
  6264. %      ****************************************
  6265. %      *            BIBLIOGRAPHY              *
  6266. %      ****************************************
  6267. %
  6268. %  A bibliography is created by the bibliography environment, which
  6269. %  generates a title such as ``References'', and a list of entries.
  6270. %  The BIBTeX program will create a file containing such an environment,
  6271. %  which will be read in by the \bibliography command.  With
  6272. %  BIBTeX, the following commands will be used.
  6273. %
  6274. %  \bibliography{FILE1,FILE2, ... ,FILEn} : specifies
  6275. %     the bibdata files.  Writes a \bibdata entry on the .aux file
  6276. %     and tries to read in mainfile.BBL.
  6277. %
  6278. %  \bibliographystyle{STYLE} : Writes a \bibstyle entry on the .aux file.
  6279. %
  6280. %  The thebibliography environment is a list environment.  To save the
  6281. %  use of an extra counter, it should use  enumiv  as the item counter.
  6282. %  Instead of using \item, items in the bibliography are produced by the
  6283. %  following commands:
  6284. %    \bibitem{NAME}             : Produces a numbered entry cited as NAME.
  6285. %    \bibitem[LABEL]{NAME}      : Produces an entry labeled by LABEL and
  6286. %                                 cited by NAME.
  6287. %  The former is used for bibliographies with citations like [1], [2], etc.;
  6288. %  the latter is used for citations like [Knuth82].
  6289. %
  6290. %  The document style must define the thebibliography environment.  This
  6291. %  environment has a single argument, which is the widest bibliography
  6292. %  label-- e.g., if the [Knuth67] is the widest entry, then thist argument
  6293. %  will be Knuth67.  The \thebibliography command must begin a list
  6294. %  environment, which the \endthebibliography command ends.
  6295. %
  6296. %  Entries are cited by the command \cite{NAME}.
  6297. %
  6298. %  PARAMETERS
  6299. %
  6300. %   \@cite     : A macro such that \@cite{LABEL1,LABEL2}{NOTE}
  6301. %                produces the output for a \cite[NOTE]{FOO1,FOO2} command,
  6302. %                where entry FOOi is defined by \bibitem[LABELi]{FOOi}.
  6303. %                The switch @tempswa is true if the optional NOTE argument
  6304. %                is present.
  6305. %                The default definition is :
  6306. %                  \@cite{LABELS}{NOTE} ==
  6307. %                     BEGIN [LABELS
  6308. %                           IF @tempswa = T THEN , NOTE FI
  6309. %                           ]
  6310. %                     END
  6311. %
  6312. %   \@biblabel : A macro to produce the label in the bibliography
  6313. %                entry.  For \bibitem[LABEL]{NAME}, the label is
  6314. %                generated by \@biblabel{LABEL}.  It has the default
  6315. %                definition \@biblabel{LABEL} -> [LABEL].
  6316. %  CONVENTION
  6317. %
  6318. %  \b@FOO : The name or number of the reference created by \cite{FOO}
  6319. %           E.g., if \cite{FOO} -> [17] , then \b@FOO -> 17.
  6320. %
  6321. %
  6322.  
  6323. \def\bibitem{\@ifnextchar[{\@lbibitem}{\@bibitem}}
  6324.  
  6325. \def\@lbibitem[#1]#2{\item[\@biblabel{#1}]\if@filesw
  6326.       { \def\protect##1{\string ##1\space}\immediate
  6327.         \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces}
  6328. %% Placement of `}' in def of \@lbibitem corrected 29 Apr 87
  6329. %% (Error found by Arthur Ogawa.)
  6330.  
  6331. \def\@bibitem#1{\item\if@filesw \immediate\write\@auxout
  6332.        {\string\bibcite{#1}{\the\c@enumi}}\fi\ignorespaces}
  6333.  
  6334. \def\bibcite#1#2{\global\@namedef{b@#1}{#2}}
  6335.  
  6336. \let\citation\@gobble
  6337.  
  6338. \def\cite{\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
  6339.  
  6340. % \penalty\@m added to definition of \@citex to allow a line
  6341. % break after the `,' in citations like [Jones80,Smith77]
  6342. % (Added 23 Oct 86)
  6343. %
  6344. % space added after the `,' (21 Nov 87)
  6345. %
  6346. \def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
  6347.   \def\@citea{}\@cite{\@for\@citeb:=#2\do
  6348.     {\@citea\def\@citea{,\penalty\@m\ }\@ifundefined
  6349.        {b@\@citeb}{{\bf ?}\@warning
  6350.        {Citation `\@citeb' on page \thepage \space undefined}}%
  6351. \hbox{\csname b@\@citeb\endcsname}}}{#1}}
  6352.  
  6353. \let\bibdata=\@gobble
  6354. \let\bibstyle=\@gobble
  6355.  
  6356. \def\bibliography#1{\if@filesw\immediate\write\@auxout{\string\bibdata{#1}}\fi
  6357.   \@input{\jobname.bbl}}
  6358.  
  6359. \def\bibliographystyle#1{\if@filesw\immediate\write\@auxout
  6360.     {\string\bibstyle{#1}}\fi}
  6361.  
  6362. % \nocite{CITATIONS} : puts information on .AUX file to cause
  6363. %   BibTeX to include the CITATIONS list in the bibliography,
  6364. %   but puts nothing in the text.  (Added 14 Jun 85)
  6365.  
  6366. \def\nocite#1{\@bsphack
  6367.   \if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi
  6368.   \@esphack}
  6369.  
  6370.  
  6371.  
  6372. %DEFAULT DEFINITIONS
  6373.  
  6374. \def\@cite#1#2{[{#1\if@tempswa , #2\fi}]}
  6375. \def\@biblabel#1{[#1]\hfill}
  6376.  
  6377.  \message{floats,}
  6378. %     ****************************************
  6379. %     *               FLOATS                 *
  6380. %     ****************************************
  6381. %
  6382. %  The different types of floats are identified by a TYPE name, which is
  6383. %  the name of the counter for that kind of float.  For example, figures
  6384. %  are of type 'figure' and tables are of type 'table'.  Each TYPE has
  6385. %  associated a positive TYPE NUMBER, which is a power of two.  E.g.,
  6386. %  figures might be have type number 1, tables type number 2, programs
  6387. %  type number 4, etc.
  6388. %
  6389. %  The locations where a float can go are specified by a PLACEMENT
  6390. %  SPECIFIER, which is a list of the possible locations, each denoted
  6391. %  by a letter as follows:
  6392. %     h : here   - at the current location in the text.
  6393. %     t : top    - at the top of a text page.
  6394. %     b : bottom - at the bottom of a text page.
  6395. %     p : page   - on a separate float page.
  6396. %  For example, 'pht' specifies that the float can appear in any of three
  6397. %  locations: page, here or top.
  6398. %
  6399. % Where floats may appear on a page, and how many may appear there
  6400. % are specified by the following float placement parameters.  The
  6401. % numbers are named like counters so the user can set them with
  6402. % the ordinary counter-setting commands.
  6403. %
  6404. %  \c@topnumber            : Number of floats allowed at the top of a column.
  6405. %  \topfraction            : Fraction of column that can be devoted to floats.
  6406. %  \c@dbltopnumber, \dbltopfraction : Same as above, but for double-column
  6407. %                          floats.
  6408. %  \c@bottomnumber, \bottomfraction : Same as above for bottom of page.
  6409. %  \c@totalnumber          : Number of floats allowed in a single column,
  6410. %                          including in-text floats.
  6411. %  \textfraction         : Minimum fraction of column that must contain text.
  6412. %  \floatpagefraction    : Minimum fraction of page that must be taken
  6413. %                          up by float page.
  6414. %  \dblfloatpagefraction : Same as above, for double-column floats.
  6415. %
  6416. % The document style must define the following.
  6417. %
  6418. %    \fps@TYPE   : The default placement specifier for floats of type TYPE.
  6419. %
  6420. %    \ftype@TYPE : The type number for floats of type TYPE.
  6421. %
  6422. %    \ext@TYPE   : The file extension indicating the file on which the
  6423. %                  contents list for float type TYPE is stored.  For example,
  6424. %                  \ext@figure = 'lof'.
  6425. %
  6426. %    \fnum@TYPE  : A macro to generate the figure number for a caption.
  6427. %                  For example, \fnum@TYPE == Figure \thefigure.
  6428. %
  6429. %    \@makecaption{NUM}{TEXT} : A macro to make a caption, with NUM the value
  6430. %                  produced by \fnum@... and TEXT the text of the caption.
  6431. %                  It can assume it's in a \parbox of the appropriate width.
  6432. %
  6433. % \@float{TYPE}[PLACEMENT] : This macro begins a float environment for a
  6434. %     single-column float of type TYPE with PLACEMENT as the placement
  6435. %     specifier.  The default value of PLACEMENT is defined by \fps@TYPE.
  6436. %     The environment is ended by \end@float.
  6437. %     E.g., \figure == \@float{figure}, \endfigure == \end@float.
  6438. %
  6439. %  \caption ==
  6440. %    BEGIN
  6441. %     \refstepcounter{\@captype}
  6442. %     \@dblarg{\@caption{\@captype}}
  6443. %    END
  6444. %
  6445. %% In following definition, \par moved from after \addcontentsline to
  6446. %% before \addcontentsline because the \write could cause
  6447. %% an extra blank line to be added to the paragraph above the
  6448. %% caption.  (Change made 12 Jun 87)
  6449. %
  6450. %  \@caption{TYPE}[STEXT]{TEXT} ==
  6451. %   BEGIN
  6452. %     \par
  6453. %     \addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}}
  6454. %     \begingroup
  6455. %       \@parboxrestore
  6456. %       \normalsize
  6457. %       \@makecaption{\fnum@TYPE}{TEXT}
  6458. %       \par
  6459. %     \endgroup
  6460. %   END
  6461. %
  6462. %  \@float{TYPE}[PLACEMENT] ==
  6463. %   BEGIN
  6464. %     if hmode then \@bsphack
  6465. %                   \@floatpenalty := -10002
  6466. %              else \@floatpenalty := -10003
  6467. %     fi
  6468. %     \@captype ==L TYPE
  6469. %     if inner
  6470. %       then LaTeX Error: 'Not in outer paragraph mode.'
  6471. %            \@floatpenalty := 0
  6472. %       else if \@freelist nonempty
  6473. %              then \@currbox  :=L head of \@freelist
  6474. %                   \@freelist :=G tail of \@freelist
  6475. %                   \count\@currbox :=G 32*\ftype@TYPE + 16 +
  6476. %                                          bits determined by PLACEMENT
  6477. %              else \@floatpenalty := 0
  6478. %                   LaTeX Error: 'Too many unprocessed floats'
  6479. %            fi
  6480. %     fi
  6481. %     \@currbox :=G \vbox{  %% 15 Dec 87 -- removed \boxmaxdepth :=L 0pt
  6482. %                           %% that made box zero depth because it screwed
  6483. %                           %% things up.  Instead, added \vskip 0pt at end
  6484. %                     \hsize = \columnwidth
  6485. %                     \@parboxrestore
  6486. %   END
  6487. %
  6488. %  \end@float ==
  6489. %    BEGIN
  6490. %       \vskip 0pt %% makes 0 depth box -- added 15 Dec 87
  6491. %       }
  6492. %      if \@floatpenalty < 0
  6493. %        then add \@currbox to \@currlist
  6494. %             if \ht\@currbox > \textheight
  6495. %               then \ht\@currbox :=G \textheight fi
  6496. %             if \@floatpenalty < -10002
  6497. %               then \penalty -10004
  6498. %                    \vbox{}
  6499. %                    \penalty \@floatpenalty
  6500. %               else \vadjust{\penalty -10004
  6501. %                             \vbox{}
  6502. %                             \penalty \@floatpenalty}
  6503. %                    \@esphack
  6504. %      fi    fi
  6505. %    END
  6506. %
  6507. %  \@dblfloat{TYPE}[PLACEMENT] : Macro to begin a float environment for a
  6508. %     double-column float of type TYPE with PLACEMENT as the placement
  6509. %     specifier.  The default value of PLACEMENT is 'tp'
  6510. %     The environment is ended by \end@dblfloat.
  6511. %     E.g., \figure* == \@dblfloat{figure}, \endfigure* == \end@dblfloat.
  6512. %
  6513. %  \@dblfloat{TYPE}[PLACEMENT] ==
  6514. %     Identical to \@float{TYPE}[PLACEMENT] except \hsize and \linewidth
  6515. %     are set to \textwidth.
  6516. %
  6517. %  \end@dblfloat ==
  6518. %     BEGIN    %%% { BRACE MATCHING
  6519. %       \vskip 0pt %% makes 0 depth box -- added 15 Dec 87
  6520. %       }
  6521. %       if \@floatpenalty < 0
  6522. %         then \@dbldeferlist :=G \@dbldeferlist * \@currbox
  6523. %       fi
  6524. %       if \@floatpenalty = -10002 then \@esphack  fi
  6525. %     END
  6526. %
  6527. \newcount\@floatpenalty
  6528.  
  6529. \def\caption{\refstepcounter\@captype \@dblarg{\@caption\@captype}}
  6530.  
  6531.  
  6532. \long\def\@caption#1[#2]#3{\par\addcontentsline{\csname
  6533.   ext@#1\endcsname}{#1}{\protect\numberline{\csname
  6534.   the#1\endcsname}{\ignorespaces #2}}\begingroup
  6535.     \@parboxrestore
  6536.     \normalsize
  6537.     \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
  6538.   \endgroup}
  6539.  
  6540. \def\@float#1{\@ifnextchar[{\@xfloat{#1}}{\edef\@tempa{\noexpand\@xfloat
  6541.     {#1}[\csname fps@#1\endcsname]}\@tempa}}
  6542.  
  6543. \def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
  6544.    \@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner
  6545.       \@parmoderr\@floatpenalty\z@
  6546.     \else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname
  6547.        \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n
  6548.        \@tfor \@tempa :=#2\do
  6549.                         {\if\@tempa h\advance\@tempcnta \@ne\fi
  6550.                          \if\@tempa t\advance\@tempcnta \tw@\fi
  6551.                          \if\@tempa b\advance\@tempcnta 4\relax\fi
  6552.                          \if\@tempa p\advance\@tempcnta 8\relax\fi
  6553.          }\global\count\@currbox\@tempcnta}\@fltovf\fi
  6554.     \global\setbox\@currbox\vbox\bgroup
  6555. %    \boxmaxdepth\z@     % commented out 15 Dec 87
  6556.     \hsize\columnwidth \@parboxrestore}
  6557.  
  6558. \def\end@float{\par\vskip\z@\egroup %% \par\vskip\z@ added 15 Dec 87
  6559.    \ifnum\@floatpenalty <\z@
  6560.      \@cons\@currlist\@currbox
  6561.      \ifdim \ht\@currbox >\textheight
  6562.         \ht\@currbox\textheight \fi
  6563.      \ifnum\@floatpenalty < -\@Mii
  6564.         \penalty -\@Miv
  6565.         \@tempdima\prevdepth    %% saving and restoring \prevdepth added
  6566.         \vbox{}                 %% 26 May 87 to prevent extra vertical
  6567.         \prevdepth \@tempdima   %% space when used in vertical mode
  6568.         \penalty\@floatpenalty
  6569.       \else \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@esphack
  6570.      \fi\fi}
  6571.  
  6572.  
  6573. \def\@dblfloat{\if@twocolumn\let\@tempa\@dbflt\else\let\@tempa\@float\fi
  6574.   \@tempa}
  6575.  
  6576. \def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tp]}}
  6577.  
  6578. \def\@xdblfloat#1[#2]{\@xfloat{#1}[#2]\hsize\textwidth\linewidth\textwidth}
  6579.  
  6580. \def\end@dblfloat{\if@twocolumn
  6581.      \par\vskip\z@\egroup %% \par\vskip\z@ added 15 Dec 87\egroup
  6582.      \ifnum\@floatpenalty <\z@ \@cons\@dbldeferlist\@currbox\fi
  6583.       \ifnum \@floatpenalty =-\@Mii \@esphack\fi\else\end@float\fi}
  6584.  
  6585. \newcount\c@topnumber
  6586. \newcount\c@dbltopnumber
  6587. \newcount\c@bottomnumber
  6588. \newcount\c@totalnumber
  6589.  
  6590. \def\@floatplacement{\global\@topnum\c@topnumber
  6591.    \global\@toproom \topfraction\@colht
  6592.    \global\@botnum  \c@bottomnumber
  6593.    \global\@botroom \bottomfraction\@colht
  6594.    \global\@colnum  \c@totalnumber
  6595.    \@fpmin   \floatpagefraction\@colht}
  6596.  
  6597. \def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber
  6598.    \global\@dbltoproom \dbltopfraction\@colht
  6599.    \@fpmin \dblfloatpagefraction\textheight
  6600.    \@fptop \@dblfptop
  6601.    \@fpsep \@dblfpsep
  6602.    \@fpbot \@dblfpbot}
  6603.  
  6604. %   MARGINAL NOTES:
  6605. %
  6606. %   Marginal notes use the same mechanism as floats to communicate
  6607. %   with the \output routine.  Marginal notes are distinguished from
  6608. %   floats by having a negative placement specification.  The command
  6609. %   \marginpar [LTEXT]{RTEXT} generates a marginal note in a parbox,
  6610. %   using LTEXT if it's on the left and RTEXT if it's on the right.
  6611. %   (Default is RTEXT = LTEXT.)  It uses the following parameters.
  6612. %
  6613. %   \marginparwidth : Width of marginal notes.
  6614. %   \marginparsep   : Distance between marginal note and text.
  6615. %        the page layout to determine how to move the marginal
  6616. %        note into the margin.   E.g., \@leftmarginskip ==
  6617. %        \hskip -\marginparwidth \hskip -\marginparsep .
  6618. %   \marginparpush  :  Minimum vertical separation between \marginpar's
  6619. %
  6620. %  Marginal notes are normally put on the outside of the page
  6621. %  if @mparswitch = true, and on the right if @mparswitch = false.
  6622. %  The command \reversemarginpar reverses the side where they
  6623. %  are put.  \normalmarginpar undoes \reversemarginpar.
  6624. %  These commands have no effect for two-column output.
  6625. %
  6626. %  SURPRISE: if two marginal notes appear on the same line of
  6627. %  text, then the second one could appear on the next page, in
  6628. %  a funny position.
  6629. %
  6630. %
  6631. %  \marginpar [LTEXT]{RTEXT} ==
  6632. %   BEGIN
  6633. %     if hmode then \@bsphack
  6634. %                   \@floatpenalty := -10002
  6635. %              else \@floatpenalty := -10003
  6636. %     fi
  6637. %     if inner
  6638. %       then LaTeX Error: 'Not in outer paragraph mode.'
  6639. %            \@floatpenalty := 0
  6640. %       else if \@freelist has two elements:
  6641. %              then get \@marbox, \@currbox  from \@freelist
  6642. %                   \count\@marbox :=G -1
  6643. %              else \@floatpenalty := 0
  6644. %                   LaTeX Error: 'Too many unprocessed floats'
  6645. %                   \@currbox, \@marbox := \@tempboxa    %%use \def
  6646. %            fi
  6647. %     fi
  6648. %     if optional argument
  6649. %       then %% \@xmpar ==
  6650. %            \@savemarbox\@marbox{LTEXT}
  6651. %            \@savemarbox\@currbox{RTEXT}
  6652. %       else %% \@ympar ==
  6653. %            \@savemarbox\@marbox{RTEXT}
  6654. %            \box\@currbox :=G \box\@marbox
  6655. %    fi
  6656. %    %% \@xympar ==
  6657. %    if \@floatpenalty < 0 then add \@marbox to \@currlist fi
  6658. %    \setbox\@tempboxa =L     %% added 3 Jan 88 to correct bug introduced
  6659. %       { \end@float %%%% BRACE MATCHING}        %% by 15 Dec 87 change
  6660. %   END
  6661. %
  6662. % \@savemarbox\BOX{TEXT} ==
  6663. %   BEGIN
  6664. %     \BOX  :=G \vtop{ \hsize = \marginparwidth
  6665. %                      \@parboxrestore
  6666. %                      TEXT
  6667. %                    }
  6668. %   END
  6669. %
  6670. % \reversemarginpar == BEGIN \@mparbottom   :=G 0
  6671. %                            @reversemargin :=G true
  6672. %                      END
  6673. %
  6674. % \normalmarginpar  == BEGIN \@mparbottom   :=G 0
  6675. %                            @reversemargin :=G false
  6676. %                      END
  6677. %
  6678.  
  6679. \def\marginpar{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
  6680.    \@floatpenalty-\@Miii\fi\ifinner
  6681.       \@parmoderr\@floatpenalty\z@
  6682.     \else\@next\@currbox\@freelist{}{}\@next\@marbox\@freelist{\global
  6683.       \count\@marbox\m@ne}{\@floatpenalty\z@ \@fltovf\def\@currbox{\@tempboxa
  6684.            }\def\@marbox{\@tempboxa}}\fi
  6685.      \@ifnextchar [{\@xmpar}{\@ympar}}
  6686.  
  6687. \long\def\@xmpar[#1]#2{\@savemarbox\@marbox{#1}\@savemarbox\@currbox
  6688.    {#2}\@xympar}
  6689.  
  6690. \long\def\@ympar#1{\@savemarbox\@marbox{#1}\global\setbox\@currbox
  6691.      \copy\@marbox\@xympar}
  6692.  
  6693. \long\def\@savemarbox#1#2{\global\setbox#1\vtop{\hsize\marginparwidth
  6694.    \@parboxrestore #2}}
  6695.  
  6696. \def\@xympar{\ifnum\@floatpenalty <\z@\@cons\@currlist\@marbox\fi
  6697.      \setbox\@tempboxa\vbox   %% added 3 Jan 88
  6698.      \bgroup\end@float\@esphack}
  6699.  
  6700. \def\reversemarginpar{\global\@mparbottom\z@ \@reversemargintrue}
  6701. \def\normalmarginpar{\global\@mparbottom\z@ \@reversemarginfalse}
  6702.  
  6703.  
  6704.  \message{footnotes,}
  6705. %       ****************************************
  6706. %       *             FOOTNOTES                *
  6707. %       ****************************************
  6708. %
  6709. %   \footnote{NOTE}       : User command to insert a footnote.
  6710. %
  6711. %   \footnote[NUM]{NOTE}  : User command to insert a footnote numbered
  6712. %                           NUM, where NUM is a number -- 1, 2,
  6713. %                           etc.  For example, if footnotes are numbered
  6714. %                           *, **, etc. within pages, then \footnote[2]{...}
  6715. %                           produces footnote '**'.  This command does not
  6716. %                           step the footnote counter.
  6717. %
  6718. %   \footnotemark[NUM]    : Command to produce just the footnote mark in
  6719. %                           the text, but no footnote.  With no argument,
  6720. %                           it steps the footnote counter before generating
  6721. %                           the mark.
  6722. %
  6723. %   \footnotetext[NUM]{TEXT} : Command to produce the footnote but no
  6724. %                              mark.  \footnote is equivalent to
  6725. %                              \footnotemark \footnotetext .
  6726. %
  6727. %   As in PLAIN, footnotes use \insert\footins, and the following parameters:
  6728. %
  6729. %   \footnotesize   : Size-changing command for footnotes.
  6730. %
  6731. %   \footnotesep    : The height of a strut placed at the beginning of
  6732. %                     every footnote.
  6733. %   \skip\footins   : Space between main text and footnotes.  The rule
  6734. %                     separating footnotes from text occurs in this space.
  6735. %                     This space lies above the strut of height \footnotesep
  6736. %                     which is at the beginning of the first footnote.
  6737. %   \footnoterule   : Macro to draw the rule separating footnotes from text.
  6738. %                     It is executed right after a \vspace of \skip\footins.
  6739. %                     It should take zero vertical space--i.e., it should to
  6740. %                     a negative skip to compensate for any positive space
  6741. %                     it occupies.  (See PLAIN.TEX.)
  6742. %
  6743. %   \interfootnotelinepenalty : Interline penalty for footnotes.
  6744. %
  6745. %   \thefootnote : In usual LaTeX style, produces the footnote number.
  6746. %                  If footnotes are to be numbered within pages, then the
  6747. %                  document style file must include an \@addtoreset command
  6748. %                  to cause the footnote counter to be reset when the page
  6749. %                  counter is stepped.  This is not a good idea, though,
  6750. %                  because the counter will not always be reset in time
  6751. %                  to ensure that the first footnote on a page is footnote
  6752. %                  number one.
  6753. %
  6754. %   \@thefnmark : Holds the current footnote's mark--e.g., \dag or '1' or 'a'.
  6755. %
  6756. %   \@mpfnnumber     : A macro that generates the numbers for \footnote
  6757. %                      and \footnotemark commands. It == \thefootnote
  6758. %                      outside a minipage environment, but can be changed
  6759. %                      inside to generate numbers for \footnote's.
  6760. %
  6761. %   \@makefnmark : A macro to generate the footnote marker from \@thefnmark
  6762. %                  The default definition is \hbox{$^\@thefnmark$}.
  6763. %
  6764. %   \@makefntext{NOTE} :
  6765. %        Must produce the actual footnote, using \@thefnmark as the mark
  6766. %        of the footnote and NOTE as the text.  It is called when effectively
  6767. %        inside a \parbox, with \hsize = \columnwidth.  For example, it might
  6768. %        be as simple as
  6769. %               $^{\@thefnmark}$ NOTE
  6770. %
  6771. % In a minipage environment, \footnote and \footnotetext are redefined
  6772. % so that
  6773. %    (a) they use the counter mpfootnote
  6774. %    (b) the footnotes they produce go at the bottom of the minipage.
  6775. % The switch is accomplished by letting \@mpfn == footnote or mpfootnote
  6776. % and \thempfn == \thefootnote or \thempfootnote, and by redefining
  6777. % \@footnotetext to be \@mpfootnotetext in the minipage.
  6778. %
  6779. % \footnote{NOTE}  ==
  6780. %  BEGIN
  6781. %    \stepcounter{\@mpfn}
  6782. %    \@thefnmark :=G eval (\thempfn)
  6783. %    \@footnotemark
  6784. %    \@footnotetext{NOTE}
  6785. %  END
  6786. %
  6787. % \footnote[NUM]{NOTE} ==
  6788. %  BEGIN
  6789. %    begingroup
  6790. %       counter \@mpfn :=L NUM
  6791. %       \@thefnmark :=G eval (\thempfn)
  6792. %    endgroup
  6793. %    \@footnotemark
  6794. %    \@footnotetext{NOTE}
  6795. %  END
  6796. %
  6797. % \@footnotetext{NOTE} ==
  6798. %  BEGIN
  6799. %    \insert into \footins
  6800. %       {\footnotesize
  6801. %        \interlinepenalty :=L \interfootnotelinepenalty
  6802. %        \splittopskip     :=L \footnotesep
  6803. %        \splitmaxdepth    :=L \dp\strutbox
  6804. %        \floatingpenalty  :=L 20000
  6805. %        \hsize :=L \columnwidth
  6806. %        \@parboxrestore
  6807. %        set \@currentlabel to make \label command work right
  6808. %        \@makefntext{\rule{0pt}{\footnotesep} NOTE}
  6809. %       }
  6810. %  END
  6811. %
  6812. % \footnotemark      ==
  6813. %  BEGIN \stepcounter{footnote}
  6814. %        \@thefnmark :=G eval(\thefootnote)
  6815. %        \@footnotemark
  6816. %  END
  6817. %
  6818. % \footnotemark[NUM] ==
  6819. %   BEGIN
  6820. %       begingroup
  6821. %         footnote counter :=L NUM
  6822. %        \@thefnmark :=G eval(\thefootnote)
  6823. %       endgroup
  6824. %       \@footnotemark
  6825. %   END
  6826. %
  6827. % \@footnotemark ==
  6828. %   BEGIN
  6829. %    \leavevmode
  6830. %    IF hmode THEN \@x@sf := \the\spacefactor FI
  6831. %    \@makefnmark          % put number in main text
  6832. %    IF hmode THEN \spacefactor := \@x@sf FI
  6833. %   END
  6834. %
  6835. % \footnotetext      ==
  6836. %    BEGIN \@thefnmark :=G eval (\thempfn)
  6837. %          \@footnotetext
  6838. %    END
  6839. %
  6840. % \footnotetext[NUM] ==
  6841. %    BEGIN begingroup  counter \@mpfn :=L NUM
  6842. %                      \@thefnmark :=G eval (\thempfn)
  6843. %          endgroup
  6844. %          \@footnotetext
  6845. %    END
  6846. %
  6847.  
  6848. \@definecounter{footnote}
  6849. \def\thefootnote{\arabic{footnote}}
  6850.  
  6851. \@definecounter{mpfootnote}
  6852. \def\thempfootnote{\alph{mpfootnote}}
  6853.  
  6854. % Default definition
  6855. \def\@makefnmark{\hbox{$^{\@thefnmark}$}}
  6856.  
  6857. \newdimen\footnotesep
  6858.  
  6859. \def\footnote{\@ifnextchar[{\@xfootnote}{\stepcounter
  6860.    {\@mpfn}\xdef\@thefnmark{\thempfn}\@footnotemark\@footnotetext}}
  6861.  
  6862. \def\@xfootnote[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax
  6863.    \xdef\@thefnmark{\thempfn}\endgroup
  6864.    \@footnotemark\@footnotetext}
  6865.  
  6866. \long\def\@footnotetext#1{\insert\footins{\footnotesize
  6867.     \interlinepenalty\interfootnotelinepenalty
  6868.     \splittopskip\footnotesep
  6869.     \splitmaxdepth \dp\strutbox \floatingpenalty \@MM
  6870.     \hsize\columnwidth \@parboxrestore
  6871.    \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
  6872.     {\rule{\z@}{\footnotesep}\ignorespaces
  6873.       #1\strut}}}
  6874.  
  6875. \def\footnotemark{\@ifnextchar[{\@xfootnotemark
  6876.     }{\stepcounter{footnote}\xdef\@thefnmark{\thefootnote}\@footnotemark}}
  6877.  
  6878. \def\@xfootnotemark[#1]{\begingroup \c@footnote #1\relax
  6879.    \xdef\@thefnmark{\thefootnote}\endgroup \@footnotemark}
  6880.  
  6881. \def\@footnotemark{\leavevmode\ifhmode
  6882.   \edef\@x@sf{\the\spacefactor}\fi \@makefnmark
  6883.    \ifhmode\spacefactor\@x@sf\fi\relax}
  6884.  
  6885. \def\footnotetext{\@ifnextchar
  6886.     [{\@xfootnotenext}{\xdef\@thefnmark{\thempfn}\@footnotetext}}
  6887.  
  6888. \def\@xfootnotenext[#1]{\begingroup \csname c@\@mpfn\endcsname #1\relax
  6889.    \xdef\@thefnmark{\thempfn}\endgroup \@footnotetext}
  6890.  
  6891. \def\@mpfn{footnote}
  6892. \def\thempfn{\thefootnote}
  6893.  
  6894.  \message{initial,}
  6895. %          ****************************************
  6896. %          *    INITIAL DECLARATION COMMANDS      *
  6897. %          ****************************************
  6898. %
  6899. %                    DOCUMENT STYLE
  6900. %                    --------------
  6901. %
  6902. % The user starts his file with the command
  6903. %       \documentstyle [OPTION1, ... ,OPTIONk]{STYLE}
  6904. % which saves the OPTION's and \input's the file STYLE.STY.  When the
  6905. % STYLE.STY file issues the command \@options, the following happens
  6906. % for each i :
  6907. %     IF \ds@OPTIONi is defined
  6908. %       THEN execute \ds@OPTIONi
  6909. %       ELSE save OPTIONi on a list of unprocessed options.
  6910. %     FI
  6911. % After STYLE.STY has been executed, the file OPTIONi.STY is read for
  6912. % each OPTIONi on the list of unprocessed options.
  6913. %
  6914. % \documentstyle ==
  6915. %   BEGIN
  6916. %      IF next char = [
  6917. %        THEN  \@documentstyle
  6918. %        ELSE  \@documentstyle[]
  6919. %      FI
  6920. %   END
  6921. %
  6922. % \@documentstyle[OPTIONS]{STYLE} ==
  6923. %   BEGIN
  6924. %     \makeatletter
  6925. %     \@optionlist  :=  OPTIONS
  6926. %     \@optionfiles :=G null
  6927. %     \input STYLE.STY
  6928. %     \@elt == \input
  6929. %     \@optionfiles
  6930. %     \@elt == \relax
  6931. %     \makeatother
  6932. %   END
  6933. %
  6934. %  \@options ==
  6935. %    BEGIN
  6936. %      \@elt := \relax
  6937. %      FOR \@tempa := \@optionlist
  6938. %         DO  IF \ds@[eval(\@tempa)] defined
  6939. %               THEN  \ds@[eval(\@tempa)]
  6940. %               ELSE  \@optionfiles :=G \@optionfiles *
  6941. %                                           \@elt eval(\@tempa) \relax
  6942. %         OD  FI
  6943. %    END
  6944. %
  6945. %              PAGE STYLE COMMANDS
  6946. %              -------------------
  6947. %  \pagestyle{STYLE}     : sets the page style of the current and succeeding
  6948. %                          pages to STYLE
  6949. %
  6950. %  \thispagestyle{STYLE} : sets the page style of the current page only
  6951. %                          to STYLE
  6952. %
  6953. %  To define a page style STYLE, you must define \ps@STYLE to set the page
  6954. %  style parameters.
  6955. %
  6956. %  HOW A PAGE STYLE MAKES RUNNING HEADS AND FEET:
  6957. %
  6958. % The \ps@... command defines the macros \@oddhead, \@oddfoot,
  6959. % \@evenhead, and \@evenfoot to define the running heads and feet.
  6960. % (See output routine.)  To make headings determined by the sectioning
  6961. % commands, the page style defines the commands \chaptermark,
  6962. % \sectionmark, etc., where \chaptermark{TEXT} is called by \chapter to
  6963. % set a mark.  The \...mark commands and the \...head macros are defined
  6964. % with the help of the following macros.  (All the \...mark commands
  6965. % should be initialized to no-ops.)
  6966. %
  6967. % MARKING CONVENTIONS:
  6968. % LaTeX extends TeX's \mark facility by producing two kinds of marks
  6969. % a 'left' and a 'right' mark, using the following commands:
  6970. %     \markboth{LEFT}{RIGHT} : Adds both marks.
  6971. %     \markright{RIGHT}      : Adds a 'right' mark.
  6972. %     \leftmark  : Used in the output routine, gets the current 'left'  mark.
  6973. %                  Works like TeX's \botmark.
  6974. %     \rightmark : Used in the output routine, gets the current 'right' mark.
  6975. %                  Works like TeX's \firstmark.
  6976. % The marking commands work reasonably well for right marks 'numbered
  6977. % within' left marks--e.g., the left mark is changed by a \chapter command and
  6978. % the right mark is changed by a \section command.  However, it does
  6979. % produce somewhat anomalous results if 2 \markboth's occur on the same page.
  6980. %
  6981. % Commands like \tableofcontents that should set the marks in some page styles
  6982. % use a \@mkboth command, which is \let by the pagestyle command (\ps@...)
  6983. % to \markboth for setting the heading or to \@gobbletwo to do nothing.
  6984.  
  6985. \def\documentstyle{\@ifnextchar[{\@documentstyle}{\@documentstyle[]}}
  6986.  
  6987. \def\@documentstyle[#1]#2{\makeatletter
  6988.    \def\@optionlist{#1}\gdef\@optionfiles{}\input #2.sty\relax
  6989.    \let\@elt\input \@optionfiles \let\@elt\relax \makeatother}
  6990.  
  6991. \def\@options{\let\@elt\relax
  6992.     \@for\@tempa:=\@optionlist\do
  6993.         {\@ifundefined{ds@\@tempa}{\xdef\@optionfiles{\@optionfiles
  6994.              \@elt \@tempa.sty\relax}}{\csname ds@\@tempa\endcsname}}}
  6995.  
  6996. \def\pagestyle#1{\@nameuse{ps@#1}}
  6997. \def\thispagestyle#1{\global\@specialpagetrue\gdef\@specialstyle{#1}}
  6998.  
  6999. % \head : An obsolete command that was used in the `myheadings'
  7000. %         page style.   (Removed 14 Jun 85)
  7001. % \def\head{\@ifnextchar[{\@xhead}{\@yhead}}
  7002. % \def\@xhead[#1]#2{\if #1l \def\@lhead{#2}\else \def\@rhead{#2}\fi}
  7003. % \def\@yhead#1{\def\@lhead{#1}\def\@rhead{#1}}
  7004.  
  7005. % Initialization
  7006. %
  7007. \def\@lhead{}
  7008. \def\@rhead{}
  7009.  
  7010.  
  7011. % Default Initializations
  7012. %
  7013. \def\ps@empty{\let\@mkboth\@gobbletwo\def\@oddhead{}\def\@oddfoot{}%
  7014. \def\@evenhead{}\def\@evenfoot{}}
  7015.  
  7016. \def\ps@plain{\let\@mkboth\@gobbletwo
  7017.      \def\@oddhead{}\def\@oddfoot{\rm\hfil\thepage
  7018.      \hfil}\def\@evenhead{}\let\@evenfoot\@oddfoot}
  7019.  
  7020. \def\@leftmark#1#2{#1}
  7021. \def\@rightmark#1#2{#2}
  7022.  
  7023. %% test for @nobreak added 15 Apr 86 in \markboth and \markright
  7024. %% letting \label and \index to \relax added 22 Feb 86 so these
  7025. %%   commands can appear in sectioning command arguments
  7026. %%
  7027.  
  7028. \def\markboth#1#2{\gdef\@themark{{#1}{#2}}{\let\protect\noexpand
  7029.      \let\label\relax \let\index\relax
  7030.      \mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
  7031. \def\markright#1{{\let\protect\noexpand
  7032.      \let\label\relax \let\index\relax
  7033.      \expandafter\@markright\@themark
  7034.      {#1}\mark{\@themark}}\if@nobreak\ifvmode\nobreak\fi\fi}
  7035.  
  7036. \def\@markright#1#2#3{\gdef\@themark{{#1}{#3}}}
  7037. \def\leftmark{\expandafter\@leftmark\botmark}
  7038. \def\rightmark{\expandafter\@rightmark\firstmark}
  7039.  
  7040. % Initialization
  7041. %
  7042. \def\@themark{{}{}}
  7043.  
  7044.  
  7045. %  OTHER
  7046. %  -----
  7047. %
  7048. %   \raggedbottom : Typesets pages with no vertical stretch, so they have
  7049. %                   their natural height instead of all being exactly the
  7050. %                   same height.  (Uses a space of .0001fil to avoid
  7051. %                   interfering with the 1fil space of \newpage.)
  7052. %
  7053. %   \flushbottom  : Inverse of \raggedbottom - makes all pages the same
  7054. %                   height.
  7055. %
  7056. %   \sloppy : Resets TeX's parameters so it accepts worse line and page
  7057. %             breaks, and slightly more overfull boxes.
  7058. %
  7059. %   \fussy  : Resets TeX's parameters to their normal finnicky values.
  7060. %
  7061.  
  7062. \def\raggedbottom{\def\@textbottom{\vskip \z@ plus.0001fil}\let\@texttop\relax}
  7063. \def\flushbottom{\let\@textbottom\relax \let\@texttop\relax}
  7064.  
  7065. % Default definitions
  7066. %  \sloppy will never (well, hardly ever) produce overfull boxes, but may
  7067. %  produce underfull ones.  (14 June 85)
  7068. %  A sloppypar environment is equivalent to {\par \sloppy ... \par}.
  7069. \def\sloppy{\tolerance 10000 \hfuzz .5\p@ \vfuzz .5\p@}
  7070. \def\sloppypar{\par\sloppy}
  7071. \def\endsloppypar{\par}
  7072. \def\fussy{\tolerance 200 \hfuzz .1\p@ \vfuzz .1\p@}
  7073.  
  7074.  
  7075.  
  7076. % LaTeX default is no overfull box rule.  Changed by document
  7077. % style option
  7078.  
  7079. \overfullrule 0pt
  7080.  
  7081.  \message{output,}
  7082. %     ****************************************
  7083. %     *               OUTPUT                 *
  7084. %     ****************************************
  7085. %
  7086. %
  7087. %  PAGE LAYOUT PARAMETERS
  7088. %
  7089. %   \topmargin      : Extra space added to top of page.
  7090. %   @twoside        : boolean.  T if two-sided printing
  7091. %   \oddsidemargin  : IF @twoside = T
  7092. %                         THEN extra space added to left of odd-numbered
  7093. %                              pages.
  7094. %                         ELSE extra space added to left of all pages.
  7095. %   \evensidemargin : IF @twoside = T
  7096. %                         THEN extra space added to left of even-numbered
  7097. %                              pages.
  7098. %   \headheight     : height of head
  7099. %   \headsep        : separation between head and text
  7100. %   \footskip       : distance separation between baseline of last
  7101. %                     line of text and baseline of foot.
  7102. %                     Note difference between \footSKIP and \headSEP.
  7103. %   \textheight     : height of text on page, excluding head and foot
  7104. %   \textwidth      : width of printing on page
  7105. %   \columnsep      : IF @twocolumn = T
  7106. %                       THEN width of space between columns
  7107. %   \columnseprule  : IF @twocolumn = T
  7108. %                       THEN width of rule between columns (0 if none).
  7109. %   \columnwidth    : IF @twocolumn = T
  7110. %                       THEN (\textwidth - \columnsep)/2
  7111. %                       ELSE \textwidth
  7112. %                     It is set by the \@maketwocolumn and \@makeonecolumn
  7113. %                     commands.
  7114. %   \@textbottom    : Command executed at bottom of vbox holding text of page
  7115. %                     (including figures).  The \raggedbottom command
  7116. %                     almost \let's this to \vfil (actually sets it to
  7117. %                     \vskip \z@ plus.0001fil). %expanded 18 Jun 86
  7118. %
  7119. %   \@texttop       : Command executed at top of vbox holding text of page
  7120. %                     (including figures).  Used by letter style; can also
  7121. %                     be used to produce centered pages.  Is \let to \relax
  7122. %                     by \raggedbottom and \flushbottom.
  7123. %
  7124. %   Page layout must also initialize \@colht and \@colroom to \textheight.
  7125. %
  7126. %  PAGE STYLE PARAMETERS:
  7127. %
  7128. %   \floatsep       : Space left between floats.
  7129. %   \textfloatsep   : Space between last top float or first bottom float
  7130. %                     and the text.
  7131. %   \topfigrule     : Command to place rule (or whatever) between floats
  7132. %                     at top of page and text.  Executed in inner vertical
  7133. %                     mode right before the \textfloatsep skip separating
  7134. %                     the floats from the text.  Must occupy zero vertical
  7135. %                     space.  (See \footnoterule.)
  7136. %   \botfigrule     : Same as \topfigrule, but put after the \textfloatsep
  7137. %                     skip separating text from the floats at bottom of page.
  7138. %   \intextsep      : Space left on top and bottom of an in-text float.
  7139. %   \@maxsep        : The maximum of \floatsep, \textfloatsep and \intextsep
  7140. %   \dblfloatsep    : Space between double-column floats.
  7141. %   \dbltextfloatsep : Space between top or bottom double-column floats
  7142. %                      and text.
  7143. %   \dblfigrule     : Similar to \topfigrule, but for double-column floats.
  7144. %   \@dblmaxsep     : The maximum of \dblfloatsep and \dbltexfloatsep
  7145. %   \@fptop         : Glue to go at top of float column -- must be 0pt +
  7146. %                     stretch
  7147. %   \@fpsep         : Glue to go between floats in a float column.
  7148. %   \@fpbot         : Glue to go at bottom of float column -- must be 0pt +
  7149. %                     stretch
  7150. %   \@dblfptop, \@dblfpsep, \@dblfpbot
  7151. %                   : Analogous for double-column float page in two-column
  7152. %                     format.
  7153. %
  7154. %  FOOTNOTES: As in PLAIN, footnotes use \insert\footins.
  7155. %
  7156. %  PAGE LAYOUT SWITCHES AND MACROS
  7157. %
  7158. %   @twocolumn      : Boolean.  T if two columns per page.
  7159. %
  7160. %  PAGE STYLE MACROS AND SWITCHES
  7161. %
  7162. %   \@oddhead        : IF @twoside = T
  7163. %                           THEN macro to generate head of odd-numbered pages.
  7164. %                           ELSE macro to generate head of all pages.
  7165. %   \@evenhead       : IF @twoside = T
  7166. %                           THEN macro to generate head of even-numbered pages.
  7167. %   \@oddfoot        : IF @twoside = T
  7168. %                           THEN macro to generate foot of odd-numbered pages.
  7169. %                           ELSE macro to generate foot of all pages.
  7170. %   \@evenfoot       : IF @twoside = T
  7171. %                           THEN macro to generate foot of even-numbered pages.
  7172. %   @specialpage    : boolean.  T if current page is to have a special format.
  7173. %   \@specialstyle  : If its value is  foo then
  7174. %                      IF @specialpage = T
  7175. %                        THEN the command \ps@foo is executed to temporarily
  7176. %                             reset the page style parameters before composing
  7177. %                             the current page.  This command should execute
  7178. %                             only \def's and \edef's, making only local
  7179. %                             definitions.
  7180. %
  7181. %
  7182. %  FLOAT PLACEMENT PARAMETERS
  7183. %
  7184. % The following parameters are set by the macro \@floatplacement.
  7185. % When \@floatplacement is called,
  7186. % \@colht is the height of the page or column being built.  I.e.:
  7187. %         * For single-column page it equals \textheight.
  7188. %         * For double-column page it equals \textheight - height
  7189. %           of double-column floats on page.
  7190. % Note that some are set globally and some locally:
  7191. %    \@topnum  :=G Maximum number of floats allowed on the top of a column.
  7192. %    \@toproom :=G Maximum amount of top of column devoted to floats--
  7193. %                  excluding \textfloatsep separation below the floats and
  7194. %                  \floatsep separation between them.  For two-column
  7195. %                  output, should be computed as a function of \@colht.
  7196. %    \@botnum, \@botroom
  7197. %                : Analogous to above.
  7198. %    \@colnum  :=G Maximum number of floats allowed in a column, including
  7199. %                  in-text floats.
  7200. %    \@textmin :=L Minimum amount of text (excluding footnotes) that must
  7201. %                  appear on a text page.  %% 27 Sep 85 : made local to
  7202. %                                          %% \@addtocurcol and \@addtonextcol
  7203. %    \@fpmin   :=L Minimum height of floats in a float column.
  7204. %
  7205. % The macro \@dblfloatplacement sets the following parameters.
  7206. %    \@dbltopnum  :=G Maximum number of double-column floats allowed at the
  7207. %                     top of a two-column page.
  7208. %    \@dbltoproom :=G Maximum height of double-column floats allowed at
  7209. %                     top of two-column page.
  7210. %    \@fpmin      :=L Minimum height of floats in a float column.
  7211. % It should also perform the following local assignments where necessary
  7212. % -- i.e., where the new value differs from the old one:
  7213. %      \@fptop       :=L \@dblfptop
  7214. %      \@fpsep       :=L \@dblfpsep
  7215. %      \@fpbot       :=L \@dblfpbot
  7216. %
  7217. %  OUTPUT ROUTINE VARIABLES
  7218. %
  7219. %  \@colht : The total height of the current column.  In single column
  7220. %            style, it equals \textheight.  In two-column style, it is
  7221. %            \textheight minus the height of the double-column floats
  7222. %            on the current page.  MUST BE INITIALIZED TO \textheight.
  7223. %
  7224. %  \@colroom : The height available in the current column for text and
  7225. %              footnotes.  It equals \@colht minus the height of all
  7226. %              floats committed to the top and bottom of the current
  7227. %              column.
  7228. %
  7229. %  \footins : Footnote insertion number.
  7230. %
  7231. %  \@maxdepth : Saved value of TeX's \maxdepth.  Must be set
  7232. %               when any routine sets \maxdepth.
  7233. %
  7234. %            CALLING THE OUTPUT ROUTINE
  7235. %            --------------------------
  7236. %
  7237. % The output routine is called either by TeX's normal page-breaking
  7238. % mechanism, or by a macro putting a penalty < or = -10000 in the output
  7239. % list.  In the latter case, the penalty indicates why the output
  7240. % routine was called, using the following code.
  7241. %
  7242. %   penalty   reason
  7243. %   -------   ------
  7244. %   -10000    \pagebreak
  7245. %             \newpage
  7246. %   -10001    \clearpage (called with \penalty -10000 \vbox{} \penalty -10001
  7247. %   -10002    float insertion, called from horizontal mode
  7248. %   -10003    float insertion, called from vertical mode.
  7249. %   -10004    float insertion.
  7250. %
  7251. % Note: A float or marginpar puts the following sequence in the output
  7252. %       list:  (i) a penalty of -10004,
  7253. %             (ii) a null \vbox
  7254. %            (iii) a penalty of -10002 or -10003.
  7255. %       This solves two special problems:
  7256. %         1. If the float comes right after a \newpage or \clearpage,
  7257. %            then the first penalty is ignored, but the second one
  7258. %            invokes the output routine.
  7259. %         2. If there is a split footnote on the page, the second 'page'
  7260. %            puts out the rest of the footnote.
  7261. %
  7262. %             THE OUTPUT ROUTINE
  7263. %             ------------------
  7264. %
  7265. % FUNCTIONS USED IN THE OUTPUT ROUTINE:
  7266. %
  7267. % \@outputpage : Produces an output page with the contents of box
  7268. %              \@outputbox as the text part.  Also sets
  7269. %              \@colht :=G \textheight.   The page style is determined
  7270. %              as follows.
  7271. %                IF  @thispagestyle = true
  7272. %                  THEN  use \thispagestyle style
  7273. %                  ELSE  use ordinary page style.
  7274. %
  7275. % \@tryfcolumn\FLIST : Tries to form a float column composed of floats from
  7276. %              \FLIST with with the following parameters:
  7277. %                \@colht : height of box
  7278. %                \@fpmin : minimum height of floats in the box
  7279. %                \@fpsep : interfloat space
  7280. %                \@fptop : glue at top of box
  7281. %                \@fpbot : glue at bottom of box.
  7282. %              If it succeeds, then it does the following:
  7283. %                * \@outputbox :=L the composed float box.
  7284. %                * @fcolmade   :=L true
  7285. %                * \FLIST      :=G \FLIST - floats put in box
  7286. %                * \@freelist  :=G \@freelist + floats put in box
  7287. %              If it fails, then:
  7288. %                * @fcolmade :=L false
  7289. %           NOTE: BIT MUST BE A SINGLE TOKEN!
  7290. %
  7291. % \@makefcolumn \FLIST : Same as \@tryfcolumn except that it
  7292. %             fails to make a float column only if \FLIST is empty.
  7293. %             Otherwise, it makes a float column containing at least
  7294. %             the first box in \FLIST, disregarding \@fpmin.
  7295. %
  7296. % \@startcolumn :
  7297. %       Calls \@tryfcolumn\@deferlist{8}.  If \@tryfcolumn returns with
  7298. %       @fcolmade = false, then:
  7299. %                * Globally sets \@toplist and \@botlist to floats
  7300. %                  from \@deferlist to go at top and bottom of column,
  7301. %                  deleting them from \@deferlist.  It does
  7302. %                  this using \@colht as the total height, the page
  7303. %                  style parameters \@floatsep and \@textfloatsep, and
  7304. %                  the float placement parameters \@topnum, \@toproom,
  7305. %                  \@botnum, \@botroom, \@colnum and \textfraction.
  7306. %                * Globally sets \@colroom to \@colht minus the height
  7307. %                  of the added floats.
  7308. %
  7309. % \@startdblcolumn :
  7310. %      Calls \@tryfcolumn\@dbldeferlist{8}.  If \@tryfcolumn returns
  7311. %      with @fcolmade = false, then:
  7312. %               * Globally sets \@dbltoplist to floats from \@dbldeferlist
  7313. %                 to go at top and bottom of column, deleting them from
  7314. %                 \@dbldeferlist.  It does this using \textheight as the
  7315. %                 total height, and the parameters \@dblfloatsep, etc.
  7316. %               * Globally sets \@colht to \textheight minus the height
  7317. %                 of the added floats.
  7318. %
  7319. % \@combinefloats : Combines the text from box
  7320. %              \@outputbox with the floats from \@toplist and \@botlist,
  7321. %              putting the new box in \@outputbox.  It uses \floatsep and
  7322. %              \textfloatsep for the appropriate separations.  It puts the
  7323. %              elements of \TOPLIST and \BOTLIST onto \@freelist, and makes
  7324. %              those lists null.
  7325. %
  7326. % \@makecol : Makes the contents of \box255 plus the accumulated
  7327. %              footnotes, plus the floats in \@toplist and \@botlist,
  7328. %              into a single column of height \@colht, which it puts
  7329. %              into box \@outputbox.  It puts boxes in \@midlist back
  7330. %              onto \@freelist and restores \maxdepth.
  7331. %
  7332. % \@opcol : Outputs a column whose text is in box \@outputbox
  7333. %              If @twocolumn = false, then it calls \@outputpage,
  7334. %              sets \@colht :=G \textheight, and calls \@floatplacement.
  7335. %
  7336. %              If @twocolumn = true, then:
  7337. %                  If @firstcolumn = true, then it puts box \@outputbox
  7338. %                  into \@leftcolumn and sets @firstcolumn :=G false.
  7339. %
  7340. %                  If @firstcolumn = false, then it puts out the current
  7341. %                  two-column page, any possible two-column float pages,
  7342. %                  and determines \@dbltoplist for the next page.
  7343. %
  7344. % \@opcol ==
  7345. %  BEGIN
  7346. %   \@mparbottom :=G 0pt
  7347. %   if @twocolumn = true
  7348. %     then %% \@outputdblcol ==
  7349. %          if @firstcolumn = true
  7350. %            then @firstcolumn :=G false
  7351. %                 \@leftcolumn :=G \@outputbox
  7352. %            else @firstcolumn :=G true
  7353. %                 \@outputbox  := \vbox{
  7354. %                                   \hbox to \textwidth{
  7355. %                                     \hbox to\columnwidth{\box\@leftcolumn
  7356. %                                                          \hss}
  7357. %                                     \hfil \vrule width \columnseprule \hfil
  7358. %                                     \hbox to\columnwidth{\box\@outputbox}
  7359. %                                                           \hss}             }
  7360. %                 \@combinedblfloats
  7361. %                 \@outputpage
  7362. %                 \begingroup
  7363. %                    \@dblfloatplacement
  7364. %                    \@startdblcolumn
  7365. %                    while @fcolmade = true
  7366. %                      do  \@outputpage
  7367. %                          \@startdblcolumn  od
  7368. %                 \endgroup
  7369. %          fi
  7370. %     else
  7371. %       \@outputpage
  7372. %       \@colht :=G \textheight
  7373. %   fi
  7374. %  END
  7375. %
  7376. %  \@makecol ==
  7377. %    BEGIN
  7378. %     ifvoid \insert\footins
  7379. %        then  \@outputbox := \box255
  7380. %        else  \@outputbox := \vbox {\boxmaxdepth :=L \maxdepth
  7381. %                                              %added 21 Jan 87
  7382. %                                    \unvbox255
  7383. %                                    \vskip \skip\footins
  7384. %                                    \footnoterule
  7385. %                                    \unvbox\footins
  7386. %                                   }
  7387. %    fi
  7388. %    \@freelist :=G \@freelist * \@midlist
  7389. %    \@midlist  :=G empty
  7390. %    \@combinefloats
  7391. %    \@outputbox := \vbox to \@colht{\boxmaxdepth := \maxdepth
  7392. %                                     \@texttop
  7393. %                                     temp :=L \dp\@outputbox
  7394. %                                     \unvbox\@outputbox
  7395. %                                     \vskip -temp
  7396. %                                     \@textbottom}
  7397. %    \maxdepth :=G \@maxdepth
  7398. %    END
  7399. %
  7400. % \@outputpage ==
  7401. %   BEGIN
  7402. %     \begingroup          %%% added 11 Jun 85 to keep special page
  7403. %                          %%%  declarations local to this output page
  7404. %     \catcode`\  := 10       %%make sure space is really a space
  7405. %     \- := \@dischyph     %%% Added 4 Aug 88 in event output routine
  7406. %     \' := \@acci         %%% called inside a tabbing environment.
  7407. %     \` := \@accii
  7408. %     \= := \@acciii
  7409. %     if @specialpage = T
  7410. %       then @specialpage :=G F
  7411. %            execute \ps@[eval(\@specialstyle)]  fi
  7412. %     if \@twoside = T
  7413. %       then if \count0 odd
  7414. %                    \@thehead       ==L \@oddhead
  7415. %                    \@thefoot       ==L \@oddfoot
  7416. %                    \@themargin     ==L \oddsidemargin
  7417. %               else \@thehead       ==L \@evenhead
  7418. %                    \@thefoot       ==L \@evenfoot
  7419. %                    \@themargin     ==L \evensidemargin  fi fi
  7420. %     \shipout\vbox
  7421. %       {\normalsize          % set fonts size for head and foot
  7422. %        \baselineskip :=L \lineskip :=L 0pt
  7423. %        \par :=L \@@par       %% added 15 Sep 87 for robustness
  7424. %        \vskip \topmargin
  7425. %        \moveright\@themargin\vbox
  7426. %              { \box\@tempboxa := \vbox to \headheight{\vfil
  7427. %                                      \hbox to \textwidth
  7428. %                                         {\index == \label == \@gobble
  7429. %                                              %% Added 22 Feb 87 as bug fix
  7430. %                                          \@thehead}}
  7431. %                \dp\@tempboxa := 0pt   % Don't skip space for descenders in
  7432. %                \box\@tempboxa         % running head.
  7433. %                \vskip \headsep
  7434. %                \box\@outputbox
  7435. %                \baselineskip\footskip
  7436. %                \hbox to \textwidth{\index == \label == \@gobble
  7437. %                                        %%% added 22 Feb 87 as bug fix
  7438. %                                    \@thefoot}
  7439. %               }
  7440. %       }
  7441. %     \@colht :=G \textheight
  7442. %     \endgroup                %% added 11 Jun 85
  7443. %     \stepcounter{page}
  7444. %     \firstmark ==L \botmark   %% So marks work properly on float
  7445. %                               %% pages. (14 Jun 85)
  7446. %   END
  7447. %
  7448. % \@startcolumn ==
  7449. %  BEGIN
  7450. %    \@colroom :=G \@colht
  7451. %    if \@deferlist is empty
  7452. %      then @fcolmade := false
  7453. %      else \@tryfcolumn\@deferlist       %% else clause == \@xstartcol
  7454. %           if @fcolmade = false
  7455. %             then \begingroup
  7456. %                    \@tempb     :=L \@deferlist
  7457. %                    \@deferlist :=G empty
  7458. %                    \@elt \BOX  ==  BEGIN \@currbox == \BOX      % use \gdef
  7459. %                                          \@addtonextcol
  7460. %                                    END  == \@scolelt
  7461. %                    \@tempb
  7462. %                  \endgroup
  7463. %    fi    fi
  7464. %  END
  7465. %
  7466. % \@startdblcolumn ==
  7467. %  BEGIN
  7468. %    \@colht :=G \textheight
  7469. %      \@tryfcolumn\@dbldeferlist      %% else clause == \@xstartcol
  7470. %      if @fcolmade = false
  7471. %        then \begingroup
  7472. %               \@tempb        :=L \@dbldeferlist
  7473. %               \@dbldeferlist :=G empty
  7474. %               \@elt \BOX     ==  BEGIN \@currbox == \BOX      % use \gdef
  7475. %                                        \@addtodblcol
  7476. %                                  END  == \@sdblcolelt
  7477. %               \@tempb
  7478. %             \endgroup
  7479. %    fi    fi
  7480. %  END
  7481. %
  7482. % \output ==
  7483. %  BEGIN
  7484. %   case of \outputpenalty
  7485. %      > -10001  -> \@makecol
  7486. %                   \@opcol
  7487. %                   \@floatplacement
  7488. %                   \@startcolumn
  7489. %                   while  @fcolmade = true
  7490. %                      do \@opcol
  7491. %                         \@startcolumn
  7492. %                      od
  7493. %
  7494. %  %%% \@specialoutput ==
  7495. %
  7496. %      -10001   ->  %% \@doclearpage ==
  7497. %                      if there are no footnote insertions
  7498. %                        then unbox the \writes at the head of \box255
  7499. %                               and throw away the rest
  7500. %                             \@deferlist :=G \@toplist * \@botlist
  7501. %                                                * \@deferlist
  7502. %                             \@toplist :=G \@botlist :=G empty
  7503. %                             \@colroom :=G \@colht
  7504. %                             if \@currlist not empty
  7505. %                               then  LaTeX error: float(s) lost
  7506. %                                     \@currlist :=G empty
  7507. %                             fi
  7508. %                             \@makefcolumn\@deferlist
  7509. %                             while  @fcolmade = true
  7510. %                                  do \@opcol
  7511. %                                     \@makefcolumn\@deferlist
  7512. %                                  od
  7513. %                             if @twocolumn
  7514. %                               then
  7515. %                                 if @firstcolumn = true
  7516. %                                   then \@dbldeferlist :=G \@dbltoplist *
  7517. %                                                           \@dbldeferlist
  7518. %                                        \@dbltoplist   :=G empty
  7519. %                                        \@colht :=G \textheight
  7520. %                                        \begingroup
  7521. %                                           \@dblfloatplacement
  7522. %                                           \@makefcolumn\@dbldeferlist
  7523. %                                           while  @fcolmade = true
  7524. %                                             do \@outputpage
  7525. %                                                \@makefcolumn\@dbldeferlist
  7526. %                                             od
  7527. %                                        \endgroup
  7528. %                                   else  \vbox{} \clearpage
  7529. %                             fi fi
  7530. %                        else \box255 := \vbox{\box255\vfil}
  7531. %                             \@makecol
  7532. %                             \@opcol
  7533. %                             \clearpage
  7534. %                      fi
  7535. %    < -10001     ->
  7536. %              if \outputpenalty < -10003
  7537. %                then if \outputpenalty <-20000  %% true only at end
  7538. %                        then \deadcycles := 0
  7539. %                     fi
  7540. %                     box \@holdpg :=G box255
  7541. %                else throw away box 255
  7542. %                     \@pagedp :=L natural depth of box \@holdpg
  7543. %                     \@pageht :=L natural ht of box \@holdpg
  7544. %                     \unvbox box \@holdpg  %% put text back
  7545. %                     if \@currlist nonempty
  7546. %                        then \@currbox  :=L head of \@currlist
  7547. %                             \@currlist :=G tail of \@currlist
  7548. %                             if \count\@currbox > 0
  7549. %                           %% Changed 28 Feb 88 so \@pageht and \@pagedp
  7550. %                           %% aren't changed for a marginal note
  7551. %                               then  %% this is a float
  7552. %                                 if there are footnote insertions
  7553. %                                   then advance \@pageht and \@pagedp and
  7554. %                                   reinsert footnotes
  7555. %                                 fi
  7556. %                                 \@addtocurcol
  7557. %                               else  %% this is a marginal note
  7558. %                                 if there are footnote insertions
  7559. %                                   reinsert footnotes
  7560. %                                 fi
  7561. %                                 \@addmarginpar
  7562. %                             fi
  7563. %                        else  THIS SHOULDN'T HAPPEN
  7564. %                     fi
  7565. %                     if \outputpenalty < 0           %% TO PERMIT PAGE BREAK
  7566. %                       then \penalty\interlinepenalty fi %% IF \@addtocurcol
  7567. %                                               %%  DIDN'T INSERT A PENALTY
  7568. %              fi
  7569. %   end case
  7570. %  \vsize :=G if \outputpenalty > -10004 then \@colroom  %%normal case
  7571. %                                        else \maxdimen  %%processing float
  7572. %             fi
  7573. %  END
  7574. %
  7575. % \@combinefloats ==
  7576. %  BEGIN
  7577. %    if \@toplist nonempty
  7578. %      then %%\@cfla ==
  7579. %           \@elt\BOX == BEGIN  \@tempbox := \vbox{\unvbox\@tempbox
  7580. %                                                  \box\BOX
  7581. %                                                  \vskip \floatsep}
  7582. %                         END  ==  \@comflelt
  7583. %            \@tempbox := null
  7584. %            \@toplist
  7585. %            \@outputbox := \vbox{\boxmaxdepth :=L \maxdepth
  7586. %                                              %added 21 Jan 87
  7587. %                                 \unvbox\@tempbox
  7588. %                                 \vskip - \floatsep
  7589. %                                 \topfigrule
  7590. %                                 \vskip \textfloatsep
  7591. %                                 \unvbox\@outputbox                }
  7592. %            \@elt == \relax
  7593. %            \@freelist :=G \@freelist * \@toplist
  7594. %            \@toplist  :=G null
  7595. %    fi
  7596. %    if \@botlist nonempty
  7597. %      then  %%\@cflb ==
  7598. %            \@elt == \@comflelt
  7599. %            \@tempbox   := null
  7600. %            \@botlist
  7601. %            \@outputbox := \vbox{ \unvbox\@outputbox
  7602. %                                  \vskip \textfloatsep
  7603. %                                  \botfigrule
  7604. %                                  \unvbox\@tempbox
  7605. %                                  \vskip  - \floatsep   }
  7606. %            \@elt == \relax
  7607. %            \@freelist :=G \@freelist * \@botlist
  7608. %            \@botlist  :=G null
  7609. %    fi
  7610. %  END
  7611. %
  7612. % \@combinedblfloats ==
  7613. %  BEGIN
  7614. %    if \@dbltoplist nonempty
  7615. %      then \@elt == \@comdblflelt
  7616. %            \@tempbox := null
  7617. %            \@dbltoplist
  7618. %            \@outputbox := \vbox to \textheight
  7619. %                              {\boxmaxdepth :=L \maxdepth
  7620. %                               \unvbox\@tempbox
  7621. %                               \vskip - \dblfloatsep
  7622. %                               \dblfigrule
  7623. %                               \vskip \dbltextfloatsep
  7624. %                               \box\@outputbox                         }
  7625. %            \@elt == \relax
  7626. %            \@freelist :=G \@freelist * \@dbltoplist
  7627. %            \@dbltoplist  :=G null
  7628. %    fi
  7629. %  END
  7630. %
  7631. %
  7632. %            USER COMMANDS THAT CALL OR AFFECT THE OUTPUT ROUTINE
  7633. %            ----------------------------------------------------
  7634. %
  7635. % \newpage == BEGIN \par\vfil\penalty -10000 END
  7636. %
  7637. % \clearpage == BEGIN \newpage
  7638. %                     \write -1{}    % Part of hack to make sure no
  7639. %                     \vbox{}        % \write's get lost.
  7640. %                     \penalty -10001
  7641. %               END
  7642. %
  7643. % \cleardoublepage == BEGIN \clearpage
  7644. %                           if @twoside = true and c@page is even
  7645. %                             then \hbox{} \newpage fi
  7646. %                     END
  7647. %
  7648. % \twocolumn ==
  7649. %  BEGIN
  7650. %    \clearpage
  7651. %    \columnwidth :=G .5(\textwidth - \columnsep)
  7652. %    \hsize       :=G \columnwidth
  7653. %    @twocolumn   :=G true
  7654. %    @firstcolumn :=G true
  7655. %    \@dblfloatplacement
  7656. %  END
  7657. %
  7658. % \onecolumn ==
  7659. %  BEGIN
  7660. %    \clearpage
  7661. %    \columnwidth :=G \textwidth
  7662. %    \hsize       :=G \columnwidth
  7663. %    @twocolumn   :=G false
  7664. %    \@floatplacement
  7665. %  END
  7666. %
  7667. %
  7668. % \topnewpage{BOX} : starts a new page and puts BOX in a parbox of width
  7669. %     \textwidth across the top.  Useful for full-width titles for
  7670. %     double-column pages.
  7671. %     SURPRISE: The stretch from \@dbltextfloatsep will be inserted
  7672. %     between the BOX and the top of the two columns.
  7673. %
  7674. % \topnewpage{BOX} ==
  7675. %  BEGIN
  7676. %   \clearpage
  7677. %   Take \@currbox from \@freelist
  7678. %   \box\@currbox :=G \parbox{BOX \par
  7679. %                             \vskip - \@dbltextfloatsep}
  7680. %   \count\@currbox :=G 2
  7681. %   \@dbltopnum     :=G 1
  7682. %   \@dbltoproom    :=G maxdimension
  7683. %   \@addtodblcol
  7684. %   \vsize          :=G \@colht
  7685. %   \@colroom       :=G \@colht
  7686. %  END
  7687.  
  7688.  
  7689. %            FLOAT-HANDLING MECHANISMS
  7690. %            -------------------------
  7691. %
  7692. % The float environment obtains an insertion number B from the
  7693. % \@freelist (see below for a description of list manipulation), puts
  7694. % the float into box B and sets \count B to a FLOAT SPECIFIER.  For
  7695. % a normal (not double-column) float, it then causes a page break
  7696. % in one of the following two ways:
  7697. %   - In outer hmode: \vadjust{\penalty -10002}
  7698. %   - In vmode :      \penalty -10003.
  7699. % For a double-column float, it puts B onto the \@dbldeferlist.
  7700. % The float specifier has two components:
  7701. %    * A PLACEMENT SPECIFICATION, describing where the float may
  7702. %      be placed.
  7703. %    * A TYPE, which is a power of two--e.g., figures might be
  7704. %      type 1 floats, tables type 2 floats, programs type 4 floats, etc.
  7705. % The float specifier is encoded as follows, where bit 0 is the least
  7706. % significant bit.
  7707. %
  7708. %  Bit    Meaning
  7709. %  ---    -------
  7710. %   0     1 iff the float may go where it appears in the text.
  7711. %   1     1 iff the float may go on the top of a page.
  7712. %   2     1 iff the float may go on the bottom of a page.
  7713. %   3     1 iff the float may go on a float page.
  7714. %   4     always 1
  7715. %   5     1 iff a type 1 float
  7716. %   6     1 iff a type 2 float
  7717. %   etc.
  7718. %
  7719. %  A negative float specifier is used to indicate a marginal note.
  7720. %
  7721. %     MACROS AND DATA STRUCTURES FOR PROCESSING FLOATS
  7722. %     ------------------------------------------------
  7723. %
  7724. %  A FLOAT LIST consisting of the floats in boxes \boxa ... \boxN has the form:
  7725. %         \@elt \boxa ... \@elt \boxN
  7726. %  where  \boxI is defined by
  7727. %         \newinsert\boxI
  7728. %  Normally, \@elt is \let to \relax.  A test can be performed on the entire
  7729. %  float list by locally \def'ing \@elt appropriately and executing
  7730. %  the list.  This is a lot more efficient than looping through the list.
  7731. %
  7732. %  The following macros are used for manipulating float lists.
  7733. %
  7734. %  \@next \CS \LIST {NONEMPTY}{EMPTY} ==  %% NOTE: ASSUME \@elt = \relax
  7735. %    BEGIN  assume that \LIST == \@elt \B1 ... \@elt \Bn
  7736. %           if n = 0
  7737. %             then  EMPTY
  7738. %             else  \CS    :=L \B1
  7739. %                   \LIST  :=G \@elt \B2 ... \@elt \Bn
  7740. %                   NONEMPTY
  7741. %           fi
  7742. %    END
  7743. %
  7744. %
  7745. %  \@bitor\NUM\LIST : Globally sets switch @test to the disjunction for all I
  7746. %        of bit  log2 \NUM of the float specifiers of all the floats in
  7747. %        \LIST.  I.e., @test is set to true iff there is at least one
  7748. %        float in \LIST having bit  log2 \NUM  of its float specifier
  7749. %        equal to 1.
  7750. %
  7751. %  Note: log2 [(\count I)/32] is the bit number corresponding to the
  7752. %  type of float I.  To see if there is any float in \LIST having
  7753. %  the same type as float I, you run \@bitor with \NUM = [(\count I)/32] * 32.
  7754. %
  7755. % \@bitor\NUM\LIST ==
  7756. %   BEGIN
  7757. %      @test :=G false
  7758. %      { \@elt \CTR ==  if \count\CTR / \NUM is odd
  7759. %                        then  @test := true       fi
  7760. %        \LIST
  7761. %      }
  7762. %   END
  7763. %
  7764. %
  7765. % \@cons\LIST\NUM : Globally sets \LIST := \LIST * \@elt \NUM
  7766. %
  7767. % \@cons\LIST\NUM ==
  7768. %   BEGIN {  \@elt == \relax
  7769. %            \LIST :=G \LIST \@elt \NUM
  7770. %         }
  7771. %
  7772. %  BOX LISTS FOR FLOAT-PLACEMENT ALGORITHMS
  7773. %
  7774. %    \@freelist     : List of empty boxes for placing new floats.
  7775. %    \@toplist      : List of floats to go at top of current column.
  7776. %    \@midlist      : List of floats in middle of current column.
  7777. %    \@botlist      : List of floats to go at bottom of current column.
  7778. %    \@deferlist    : List of floats to go after current column.
  7779. %    \@dbltoplist   : List of double-col. floats to go at top of current page.
  7780. %    \@dbldeferlist : List of double-column floats to go on subsequent pages.
  7781. %
  7782. %  FLOAT-PLACEMENT ALGORITHMS
  7783. %
  7784. % \@tryfcolumn \FLIST ==
  7785. %  BEGIN
  7786. %   @fcolmade    :=G false
  7787. %   \@trylist    :=G \FLIST
  7788. %   \@failedlist :=G empty
  7789. %   \begingroup
  7790. %    \@elt == \@xtryfc
  7791. %    \@trylist
  7792. %   \endgroup
  7793. %   if @fcolmade = true
  7794. %     then  \@vtryfc \FLIST
  7795. %   fi
  7796. %  END
  7797. %
  7798. %  \@vtryfc ==
  7799. %    BEGIN
  7800. %      \@outputbox :=G \vbox{}
  7801. %      \@elt\BOX == BEGIN
  7802. %                     \@outputbox :=L \vbox{ \unvbox \@outputbox
  7803. %                                            \vskip \@fpsep
  7804. %                                            \box\BOX            }
  7805. %                   END  == \@wtryfc
  7806. %      \@flsucceed
  7807. %      \@outputbox :=G \vbox to \@colht{ \vskip \@fptop
  7808. %                                        \vskip -\@fpsep
  7809. %                                        \unvbox \@outputbox
  7810. %                                        \vskip \@fpbot      }
  7811. %      \@elt      ==  \relax
  7812. %      \@freelist :=G \@freelist * \@flsucceed
  7813. %      \FLIST     :=G \@failedlist * \@flfail
  7814. %   END
  7815. %
  7816. % \@xtryfc \BOX ==
  7817. %  BEGIN
  7818. %    remove first element from \@trylist
  7819. %    \@currtype := (\count\BOX / 32) * 32
  7820. %    \@bitor \@currtype \@failedlist    % @test := true if type on list
  7821. %    \@testfp \BOX                      % @test := true if no p-option
  7822. %    if ht of \BOX > \@colht
  7823. %      then @test :=G true
  7824. %    fi
  7825. %    if @test = true
  7826. %      then add \BOX to \@failedlist
  7827. %      else \@ytryfc \BOX
  7828. %    fi
  7829. %  END
  7830. %
  7831. % \@ytryfc ==
  7832. %  BEGIN
  7833. %   \begingroup
  7834. %     \@flsucceed :=G \@elt\BOX
  7835. %     \@flfail    :=G empty
  7836. %     \@tempdima  := \ht\BOX
  7837. %     \@elt == \@ztryfc
  7838. %     \@trylist
  7839. %     if \@tempdima > \@fpmin
  7840. %       then @fcolmade :=G true
  7841. %       else add \BOX to \@failedlist
  7842. %     fi
  7843. %   \endgroup
  7844. %   if @fcolmade = true  then  \@elt == \@gobble fi
  7845. %  END
  7846. %
  7847. % \@ztryfc \BOX ==
  7848. %  BEGIN
  7849. %   \@tempcnta := (\count\BOX / 32) * 32
  7850. %   \@bitor \@tempcnta {\@failedlist \@flfail}  % @test := true if on a list
  7851. %   \@testfp \BOX                               % @test := true if not p-option
  7852. %   \@tempdimb := \@tempdima + ht of \BOX + \@fpsep
  7853. %   if \@tempdimb > \@colht
  7854. %     then @test :=G true
  7855. %   fi
  7856. %   if @test = true
  7857. %     then add \BOX to \@flfail
  7858. %     else add \BOX to \@flsucceed
  7859. %          \@tempdima := \@tempdimb
  7860. %   fi
  7861. %  END
  7862. %
  7863. % \@testfp \BOX == BEGIN if bit 3 of \count\BOX = 0
  7864. %                          then @test :=G true      fi
  7865. %                  END
  7866. %
  7867. % \@makefcolumn \FLIST ==
  7868. %  BEGIN
  7869. %   \begingroup
  7870. %     \@fpmin =:L 0
  7871. %     \@testfp == \@gobble
  7872. %     \@tryfcolumn \FLIST
  7873. %   \endgroup
  7874. %  END
  7875. %
  7876. %  \@addtobot : Tries to put insert \@currbox on \@botlist.  Called only when:
  7877. %                  * \ht BOX + \@maxsep < \@colroom
  7878. %                  * type of \@currbox not on \@deferlist
  7879. %                  * \@colnum > 0
  7880. %                  * @insert = false
  7881. %               If it succeeds, then:
  7882. %                  * sets @insert true
  7883. %                  * decrements \@botroom by \ht BOX
  7884. %                  * decrements \@botnum and \@colnum by 1
  7885. %                  * decrements \@colroom by \ht BOX + either \floatsep
  7886. %                    or \textfloatsep, as appropriate.
  7887. %                  * sets \maxdepth to 0pt
  7888. %
  7889. %  \@addtotoporbot : Tries to put insert \@currbox on \@toplist or \@botlist.
  7890. %                    Called only under same conditions as \@addtobot.
  7891. %                    If it succeeds, then:
  7892. %                       * sets @insert true
  7893. %                       * decrements either \@toproom or \@botroom by \ht BOX
  7894. %                       * decrements \@colnum and either \@topnum or
  7895. %                         \@botnum by 1
  7896. %                       * decrements \@colroom by \ht BOX + either \floatsep
  7897. %                         or \textfloatsep, as appropriate.
  7898. %
  7899. % \@addtocurcol : Tries to add \@currbox to current column, setting @insert
  7900. %                 true if it succeeds, false otherwise.  It will add
  7901. %                 \@currbox to top only if bit 0 of \count \@currbox is 0, and
  7902. %                 to the bottom only if bit 0 = 0 or an earlier float of
  7903. %                 the same type is put on the bottom.
  7904. %                 If the float is put in the text, then
  7905. %                 \penalty\interlinepenalty is put
  7906. %                 right after the float, before the following \vskip, and
  7907. %                 \outputpenalty :=L 0.
  7908. %
  7909. % \@addtonextcol : Tries to add \@currbox to the next column, setting @insert
  7910. %                 true if it succeeds, false otherwise.
  7911. %
  7912. % \@addtodblcol : Tries to add \@currbox to the next double-column page,
  7913. %                 adding it to \@dbltoplist if it succeeds and \@dbldeferlist
  7914. %                 if it fails.
  7915. %
  7916. %  \@addtobot ==
  7917. %    BEGIN
  7918. %      if bit 2 of \count \@currbox = 1
  7919. %        then  if \@botnum > 0
  7920. %                 then if \@botroom > \ht \@currbox
  7921. %                        then \@botnum   :=G \botnum - 1
  7922. %                             \@colnum   :=G \@colnum - 1
  7923. %                             \@tempdima  :=L - \ht\@currbox -
  7924. %                                            if \@botlist empty
  7925. %                                                then \textfloatsep
  7926. %                                                else \floatsep
  7927. %                                            fi
  7928. %                             \@botroom  :=G \@botroom + \@tempdima
  7929. %                             \@colroom  :=G \@colroom + \@tempdima
  7930. %                              add \@currbox to \@botlist
  7931. %                              \maxdepth :=G 0pt
  7932. %                              @insert :=L true
  7933. %      fi      fi       fi
  7934. %    END
  7935. %
  7936. %  \@addtotoporbot ==
  7937. %    BEGIN
  7938. %      if bit 1 of \count \@currbox = 1
  7939. %        then if \@topnum > 0
  7940. %               then if \@toproom > \ht \@currbox
  7941. %                       then if \@currtype not on \@midlist or \@botlist
  7942. %                               then \@topnum    :=G \topnum - 1
  7943. %                                    \@colnum    :=G \@colnum - 1
  7944. %                                    \@tempdima  :=L - \ht\@currbox -
  7945. %                                                   if \@toplist empty
  7946. %                                                       then \textfloatsep
  7947. %                                                       else \floatsep
  7948. %                                                   fi
  7949. %                                    \@toproom   :=G \@toproom + \@tempdima
  7950. %                                    \@colroom   :=G \@colroom + \@tempdima
  7951. %                                    add \@currbox to \@toplist
  7952. %                                    @insert :=L true
  7953. %      fi     fi      fi      fi
  7954. %      if @insert = false then \@addtobot fi
  7955. %    END
  7956. %
  7957. % \@addtocurcol ==
  7958. %  BEGIN
  7959. %    @insert :=L false
  7960. %    \@textmin := \textfraction\@colht         %% added 27 Sep 85
  7961. %    if \@colroom > \ht \@currbox + max(\@pageht+\@pagedp, \@textmin)
  7962. %                           + \@maxsep
  7963. %       then if \@colnum > 0
  7964. %               then \@currtype := type of \@currbox
  7965. %                    if \@currtype not on \@deferlist
  7966. %                      then if \@currtype on \@botlist
  7967. %                             then \@addtobot
  7968. %                             else if bit0 of \count \@currbox = 1
  7969. %                                    then  decrement \@colnum
  7970. %                                          put \@currbox on \@midlist
  7971. %                                          add \@currbox + space +
  7972. %                                            \penalty \interlinepenalty to text
  7973. %                                          \outputpenalty :=L 0
  7974. %                                          @insert := true
  7975. %                                    else  \@addtotoporbot
  7976. %    fi      fi      fi     fi     fi
  7977. %    if @insert = false
  7978. %      then add \@currbox to \@deferlist
  7979. %    fi
  7980. %  END
  7981. %
  7982. % \@addtonextcol ==
  7983. %  BEGIN
  7984. %    @insert :=L false
  7985. %    \@textmin := \textfraction\@colht         %% added 27 Sep 85
  7986. %    if \@colroom > \ht \@currbox + \@textmin + \@maxsep
  7987. %       then if \@colnum > 0
  7988. %               \@currtype := type of \@currbox
  7989. %               then if \@currtype not on \@deferlist
  7990. %                      then \@addtotoporbot
  7991. %    fi      fi      fi
  7992. %    if @insert = false
  7993. %      then add \@currbox to \@deferlist
  7994. %    fi
  7995. %  END
  7996. %
  7997. %  \@addtodblcol ==
  7998. %    BEGIN
  7999. %      @insert :=L false
  8000. %      if bit 1 of \count \@currbox = 1
  8001. %        then  if \@dbltopnum > 0
  8002. %                 then if \@dbltoproom > \ht \@currbox
  8003. %                        then if type of \@currbox not on \@dbldeferlist
  8004. %                               then \@dbltopnum   :=G \@dbltopnum - 1
  8005. %                                    \@tempdima := -\ht\@currbox -
  8006. %                                                  if \@dbltoplist empty
  8007. %                                                     then \dbltextfloatsep
  8008. %                                                     else \dblfloatsep
  8009. %                                                  fi
  8010. %                                    \@dbltoproom  :=G \@dbltoproom+\@tempdima
  8011. %                                    \@colht       :=G \@colht+\@tempdima
  8012. %                                    add \@currbox to \@dbltoplist
  8013. %                                     @insert :=L true
  8014. %      fi      fi       fi    fi
  8015. %      if @insert = false then add \@currbox to \@dbldeferlist
  8016. %    END
  8017. %
  8018. %  \@addmarginpar ==
  8019. %   BEGIN
  8020. %     if \@currlist nonempty
  8021. %       then remove \@marbox from \@currlist  %% NOTE: \@currbox = left box
  8022. %            add \@marbox and \@currbox to \@freelist
  8023. %       else LaTeX error: ?  %% shouldn't happen
  8024. %     fi
  8025. %     \@tempcnta := 1     %% 1 = right, -1 = left
  8026. %     if @twocolumn = true
  8027. %       then if @firstcolumn = true
  8028. %              then \@tempcnta := -1
  8029. %            fi
  8030. %       else if @mparswitch = true
  8031. %              then if count0 odd
  8032. %                     else \@tempcnta := -1
  8033. %                   fi
  8034. %            fi
  8035. %            if @reversemargin = true
  8036. %               then \@tempcnta := -\@tempcnta
  8037. %            fi
  8038. %     fi
  8039. %     if \@tempcnta < 0 then \box\@marbox :=G \box\@currbox fi
  8040. %     \@tempdima   :=L maximum(\@mparbottom - \@pageht + ht of \@marbox, 0)
  8041. %     if \@tempdima > 0 then LaTeX warning: 'marginpar moved' fi
  8042. %     \@mparbottom :=G \@pageht + \@tempdima + depth of \@marbox
  8043. %                          + \marginparpush
  8044. %     \@tempdima   :=L \@tempdima - ht of \@marbox
  8045. %     height of \@marbox :=G depth of \@marbox :=G 0
  8046. %     \vskip -\@pagedp
  8047. %     \vskip \@tempdima
  8048. %     \nointerlineskip
  8049. %     \hbox{ if @tempcnta > 0 then \hskip \columnwidth
  8050. %                                 \hskip \marginparsep
  8051. %                            else \hskip -\marginparsep
  8052. %                                 \hskip -\marginparwidth
  8053. %            fi
  8054. %            \box\@marbox
  8055. %            \hss
  8056. %          }
  8057. %     \vskip -\@tempdima
  8058. %     \nointerlineskip
  8059. %     \hbox{\vrule height 0 width 0 depth \@pagedp}
  8060. %   END
  8061.  
  8062.  
  8063. \maxdeadcycles = 100 % floats and \marginpar's add a lot of dead cycles
  8064.  
  8065. \let\@elt\relax
  8066.  
  8067. \def\@next#1#2#3#4{\ifx#2\@empty #4\else
  8068.    \expandafter\@xnext #2\@@#1#2#3\fi}
  8069.  
  8070. \def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}}
  8071.  
  8072. \newif\if@test
  8073.  
  8074. \def\@bitor#1#2{\global\@testfalse {\let\@elt\@xbitor
  8075.    \@tempcnta #1\relax #2}}
  8076.  
  8077. \def\@xbitor #1{\@tempcntb \count#1\divide\@tempcntb\@tempcnta
  8078.    \ifodd\@tempcntb \global\@testtrue\fi}
  8079.  
  8080. % DEFINITION OF FLOAT BOXES:
  8081. \newinsert\bx@A
  8082. \newinsert\bx@B
  8083. \newinsert\bx@C
  8084. \newinsert\bx@D
  8085. \newinsert\bx@E
  8086. \newinsert\bx@F
  8087. \newinsert\bx@G
  8088. \newinsert\bx@H
  8089. \newinsert\bx@I
  8090. \newinsert\bx@J
  8091. \newinsert\bx@K
  8092. \newinsert\bx@L
  8093. \newinsert\bx@M
  8094. \newinsert\bx@N
  8095. \newinsert\bx@O
  8096. \newinsert\bx@P
  8097. \newinsert\bx@Q
  8098. \newinsert\bx@R
  8099.  
  8100.  
  8101.  
  8102. \gdef\@freelist{\@elt\bx@A\@elt\bx@B\@elt\bx@C\@elt\bx@D\@elt\bx@E
  8103.                \@elt\bx@F\@elt\bx@G\@elt\bx@H\@elt\bx@I\@elt\bx@J
  8104.                 \@elt\bx@K\@elt\bx@L\@elt\bx@M\@elt\bx@N
  8105.                 \@elt\bx@O\@elt\bx@P\@elt\bx@Q\@elt\bx@R}
  8106.  
  8107. \gdef\@toplist{}
  8108. \gdef\@botlist{}
  8109. \gdef\@midlist{}
  8110. \gdef\@currlist{}
  8111. \gdef\@deferlist{}
  8112. \gdef\@dbltoplist{}
  8113. \gdef\@dbldeferlist{}
  8114.  
  8115. % PAGE LAYOUT PARAMETERS
  8116. \newdimen\topmargin
  8117. \newdimen\oddsidemargin
  8118. \newdimen\evensidemargin
  8119. \let\@themargin=\oddsidemargin
  8120. \newdimen\headheight
  8121. \newdimen\headsep
  8122. \newdimen\footskip
  8123. \newdimen\footheight % even though it never gets used.
  8124. \newdimen\textheight
  8125. \newdimen\textwidth
  8126. \newdimen\columnwidth
  8127. \newdimen\columnsep
  8128. \newdimen\columnseprule
  8129. \newdimen\@maxdepth    \@maxdepth = \maxdepth
  8130. \newdimen\marginparwidth
  8131. \newdimen\marginparsep
  8132. \newdimen\marginparpush
  8133.  
  8134. % PAGE STYLE PARAMETERS
  8135. \newskip\floatsep
  8136. \newskip\textfloatsep
  8137. \newskip\intextsep
  8138. \newdimen\@maxsep
  8139. \newskip\dblfloatsep
  8140. \newskip\dbltextfloatsep
  8141. \newdimen\@dblmaxsep
  8142. \newskip\@fptop
  8143. \newskip\@fpsep
  8144. \newskip\@fpbot
  8145. \newskip\@dblfptop
  8146. \newskip\@dblfpsep
  8147. \newskip\@dblfpbot
  8148. \let\topfigrule=\relax
  8149. \let\botfigrule=\relax
  8150. \let\dblfigrule=\relax
  8151.  
  8152. % INTERNAL REGISTERS
  8153.  
  8154. \newcount\@topnum
  8155. \newdimen\@toproom
  8156. \newcount\@dbltopnum
  8157. \newdimen\@dbltoproom
  8158. \newcount\@botnum
  8159. \newdimen\@botroom
  8160. \newcount\@colnum
  8161. \newdimen\@textmin
  8162. \newdimen\@fpmin
  8163. \newdimen\@colht
  8164. \newdimen\@colroom
  8165. \newdimen\@pageht
  8166. \newdimen\@pagedp
  8167. \newdimen\@mparbottom \@mparbottom\z@
  8168. \newcount\@currtype
  8169. \newbox\@outputbox
  8170. \newbox\@leftcolumn
  8171. \newbox\@holdpg
  8172.  
  8173. \newif\if@insert
  8174. \newif\if@fcolmade
  8175. \newif\if@specialpage \@specialpagefalse
  8176. \newif\if@twoside     \@twosidefalse
  8177. \newif\if@firstcolumn \@firstcolumntrue
  8178. \newif\if@twocolumn   \@twocolumnfalse
  8179. \newif\if@reversemargin \@reversemarginfalse
  8180. \newif\if@mparswitch  \@mparswitchfalse
  8181.  
  8182. \def\@thehead{\@oddhead} % initialization
  8183. \def\@thefoot{\@oddfoot}
  8184.  
  8185. \def\newpage{\par\vfil\penalty -\@M}
  8186.  
  8187. \def\clearpage{\newpage \write\m@ne{}\vbox{}\penalty -\@Mi}
  8188.  
  8189. \def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
  8190.     \hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
  8191.  
  8192. \def\twocolumn{\clearpage \global\columnwidth\textwidth
  8193.    \global\advance\columnwidth -\columnsep \global\divide\columnwidth\tw@
  8194.    \global\hsize\columnwidth \global\linewidth\columnwidth
  8195.    \global\@twocolumntrue \global\@firstcolumntrue
  8196.    \@dblfloatplacement\@ifnextchar[{\@topnewpage}{}}
  8197.  
  8198. \def\onecolumn{\clearpage\global\columnwidth\textwidth
  8199.      \global\hsize\columnwidth \global\linewidth\columnwidth
  8200.      \global\@twocolumnfalse \@floatplacement}
  8201.  
  8202. \long\def\@topnewpage[#1]{\@next\@currbox\@freelist{}{}%
  8203.     \global\setbox\@currbox\vbox{\hsize\textwidth \@parboxrestore
  8204.      #1\par\vskip -\dbltextfloatsep}\global\count\@currbox\tw@
  8205.     \global\@dbltopnum\@ne \global\@dbltoproom\maxdimen\@addtodblcol
  8206.     \global\vsize\@colht \global\@colroom\@colht}
  8207.  
  8208. \output{\ifnum\outputpenalty <-\@M\@specialoutput\else
  8209.   \@makecol\@opcol\@floatplacement\@startcolumn
  8210.   \@whilesw\if@fcolmade \fi{\@opcol\@startcolumn}\fi
  8211.   \global\vsize\ifnum\outputpenalty >-\@Miv \@colroom
  8212.                   \else \maxdimen\fi}
  8213.  
  8214. % CHANGES TO \@specialoutput:
  8215. % * \penalty\z@ changed to \penalty\interlinepenalty so \samepage
  8216. %   works properly with figure and table environments.
  8217. %   (Changed 23 Oct 86)
  8218. %
  8219. % * Definition of \@specialoutput changed 26 Feb 88 so \@pageht and \@pagedp
  8220. %   aren't changed for a marginal note.  (Change suggested by
  8221. %   Chris Rowley.)
  8222. %
  8223. \def\@specialoutput{\ifnum\outputpenalty > -\@Mii
  8224.     \@doclearpage
  8225.   \else
  8226.     \ifnum \outputpenalty <-\@Miii
  8227.        \ifnum\outputpenalty<-\@MM \deadcycles\z@\fi
  8228.        \global\setbox\@holdpg\vbox{\unvbox\@cclv}%
  8229.     \else \setbox\@tempboxa\box\@cclv
  8230.         \@pagedp\dp\@holdpg \@pageht\ht\@holdpg
  8231.         \unvbox\@holdpg
  8232.         \@next\@currbox\@currlist{\ifnum\count\@currbox >\z@
  8233.            \ifvoid\footins\else\advance\@pageht\ht\footins
  8234.              \advance\@pageht\skip\footins \advance\@pagedp\dp\footins
  8235.              \insert\footins{\unvbox\footins}\fi
  8236.             \@addtocurcol\else
  8237.            \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
  8238.             \@addmarginpar\fi}\@latexbug
  8239.     \ifnum \outputpenalty <\z@ \penalty\interlinepenalty\fi
  8240.   \fi\fi}
  8241.  
  8242.  
  8243. \def\@doclearpage{\ifvoid\footins
  8244.         \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa
  8245.         \setbox\@tempboxa\box\@cclv
  8246.         \xdef\@deferlist{\@toplist\@botlist
  8247.             \@deferlist}\gdef\@toplist{}\gdef\@botlist{}\global\@colroom\@colht
  8248.              \ifx\@currlist
  8249.               \@empty\else\@latexerr{Float(s)
  8250.                  lost}\@ehb\gdef\@currlist{}\fi
  8251.        \@makefcolumn\@deferlist
  8252.         \@whilesw\if@fcolmade \fi{\@opcol
  8253.                                   \@makefcolumn\@deferlist}\if@twocolumn
  8254.            \if@firstcolumn
  8255.              \xdef\@dbldeferlist{\@dbltoplist
  8256.                  \@dbldeferlist}\gdef\@dbltoplist{}\global\@colht\textheight
  8257.               \begingroup \@dblfloatplacement \@makefcolumn\@dbldeferlist
  8258.                \@whilesw\if@fcolmade \fi{\@outputpage
  8259.                                          \@makefcolumn\@dbldeferlist}\endgroup
  8260.            \else \vbox{}\clearpage
  8261.         \fi\fi
  8262.      \else\setbox\@cclv\vbox{\box\@cclv\vfil}\@makecol\@opcol
  8263.       \clearpage
  8264.      \fi}
  8265.  
  8266. \def\@opcol{\global\@mparbottom\z@\if@twocolumn\@outputdblcol\else
  8267.     \@outputpage \global\@colht\textheight \fi}
  8268.  
  8269. \def\@outputdblcol{\if@firstcolumn \global\@firstcolumnfalse
  8270.     \global\setbox\@leftcolumn\box\@outputbox
  8271.   \else \global\@firstcolumntrue
  8272.     \setbox\@outputbox\vbox{\hbox to\textwidth{\hbox to\columnwidth
  8273.       {\box\@leftcolumn \hss}\hfil \vrule width\columnseprule\hfil
  8274.        \hbox to\columnwidth{\box\@outputbox \hss}}}\@combinedblfloats
  8275.        \@outputpage \begingroup \@dblfloatplacement \@startdblcolumn
  8276.        \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}\endgroup
  8277.     \fi}
  8278.  
  8279. % Extra \@texttop somehow found its way into \@makecol.  Deleted
  8280. % 1 Dec 86.  (Found by Mike Harrison)
  8281. \def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv
  8282.    \else\setbox\@outputbox
  8283.      \vbox{\boxmaxdepth \maxdepth
  8284.      \unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi
  8285.      \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats
  8286.      \setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth
  8287.         \@texttop\dimen128=\dp\@outputbox\unvbox\@outputbox
  8288.         \vskip-\dimen128\@textbottom}%
  8289.      \global\maxdepth\@maxdepth}
  8290.  
  8291. \let\@texttop=\relax
  8292. \let\@textbottom=\relax
  8293.  
  8294. \def\@outputpage{\begingroup\catcode`\ =10
  8295.      \let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii
  8296.     \if@specialpage
  8297.      \global\@specialpagefalse\@nameuse{ps@\@specialstyle}\fi
  8298.      \if@twoside
  8299.        \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
  8300.             \let\@themargin\oddsidemargin
  8301.           \else \let\@thehead\@evenhead
  8302.           \let\@thefoot\@evenfoot \let\@themargin\evensidemargin
  8303.      \fi\fi
  8304.      \shipout
  8305.      \vbox{\normalsize \baselineskip\z@ \lineskip\z@
  8306.            \let\par\@@par %% 15 Sep 87
  8307.            \vskip \topmargin \moveright\@themargin
  8308.            \vbox{\setbox\@tempboxa
  8309.                    \vbox to\headheight{\vfil \hbox to\textwidth
  8310.                                        {\let\label\@gobble \let\index\@gobble
  8311.                                          \@thehead}} %% 22 Feb 87
  8312.                  \dp\@tempboxa\z@
  8313.                  \box\@tempboxa
  8314.                  \vskip \headsep
  8315.                  \box\@outputbox
  8316.                  \baselineskip\footskip
  8317.                  \hbox to\textwidth{\let\label\@gobble
  8318.                            \let\index\@gobble  %% 22 Feb 87
  8319.                            \@thefoot}}}\global\@colht\textheight
  8320.            \endgroup\stepcounter{page}\let\firstmark\botmark}
  8321.  
  8322.  
  8323. \def\@combinefloats{\boxmaxdepth\maxdepth \ifx\@toplist\@empty\else\@cfla\fi
  8324.     \ifx\@botlist\@empty\else\@cflb\fi}
  8325.  
  8326. \def\@cfla{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@toplist
  8327.     \setbox\@outputbox\vbox{\unvbox\@tempboxa\vskip-\floatsep
  8328.     \topfigrule\vskip\textfloatsep \unvbox\@outputbox}\let\@elt\relax
  8329.     \xdef\@freelist{\@freelist\@toplist}\gdef\@toplist{}}
  8330.  
  8331. \def\@cflb{\let\@elt\@comflelt \setbox\@tempboxa\vbox{}\@botlist
  8332.     \setbox\@outputbox\vbox{\unvbox\@outputbox \vskip\textfloatsep
  8333.     \botfigrule\unvbox\@tempboxa \vskip-\floatsep}\let\@elt\relax
  8334.     \xdef\@freelist{\@freelist\@botlist}\gdef\@botlist{}}
  8335.  
  8336. \def\@comflelt#1{\setbox\@tempboxa
  8337.       \vbox{\unvbox\@tempboxa\box #1\vskip\floatsep}}
  8338.  
  8339. \def\@combinedblfloats{\ifx\@dbltoplist\@empty\else
  8340.     \let\@elt\@comdblflelt \setbox\@tempboxa\vbox{}\@dbltoplist
  8341.     \setbox\@outputbox\vbox to\textheight
  8342.       {\boxmaxdepth\maxdepth
  8343.        \unvbox\@tempboxa\vskip-\dblfloatsep
  8344.        \dblfigrule\vskip\dbltextfloatsep \box\@outputbox}\let\@elt\relax
  8345.     \xdef\@freelist{\@freelist\@dbltoplist}\gdef\@dbltoplist{}\fi}
  8346.  
  8347.  
  8348. \def\@comdblflelt#1{\setbox\@tempboxa
  8349.       \vbox{\unvbox\@tempboxa\box #1\vskip\dblfloatsep}}
  8350.  
  8351.  
  8352. \def\@startcolumn{\global\@colroom\@colht
  8353.     \ifx\@deferlist\@empty\global\@fcolmadefalse\else\@xstartcol\fi}
  8354.  
  8355. \def\@xstartcol{\@tryfcolumn\@deferlist \if@fcolmade\else
  8356.    \begingroup\edef\@tempb{\@deferlist}\gdef\@deferlist{}\let\@elt\@scolelt
  8357.    \@tempb\endgroup\fi}
  8358.  
  8359. \def\@scolelt#1{\def\@currbox{#1}\@addtonextcol}
  8360.  
  8361. \def\@startdblcolumn{\global\@colht\textheight
  8362.    \@tryfcolumn\@dbldeferlist \if@fcolmade\else
  8363.      \begingroup
  8364.        \edef\@tempb{\@dbldeferlist}\gdef\@dbldeferlist{}\let\@elt\@sdblcolelt
  8365.        \@tempb\endgroup\fi}
  8366.  
  8367. \def\@sdblcolelt#1{\def\@currbox{#1}\@addtodblcol}
  8368.  
  8369. \def\@tryfcolumn #1{\global\@fcolmadefalse \xdef\@trylist{#1}\xdef\@failedlist
  8370.    {}\begingroup \let\@elt\@xtryfc \@trylist \endgroup
  8371.     \if@fcolmade \@vtryfc #1\fi}
  8372.  
  8373. \def\@vtryfc #1{\global\setbox\@outputbox\vbox{}\let\@elt\@wtryfc
  8374.        \@flsucceed \global\setbox\@outputbox\vbox to\@colht{\vskip \@fptop
  8375.        \vskip -\@fpsep \unvbox \@outputbox \vskip \@fpbot}\let\@elt\relax
  8376.        \xdef #1{\@failedlist\@flfail}\xdef\@freelist{\@freelist\@flsucceed}}
  8377.  
  8378. \def\@wtryfc #1{\global\setbox\@outputbox\vbox{\unvbox\@outputbox
  8379.     \vskip\@fpsep\box #1}}
  8380.  
  8381.  
  8382. \def\@xtryfc #1{\@next\@tempa\@trylist{}{}\@currtype
  8383.   \count #1\divide\@currtype\@xxxii \multiply\@currtype\@xxxii
  8384.   \@bitor \@currtype \@failedlist \@testfp #1\ifdim
  8385.     \ht #1>\@colht \global\@testtrue\fi
  8386.     \if@test \@cons\@failedlist #1\else \@ytryfc #1\fi}
  8387.  
  8388. \def\@ytryfc #1{\begingroup \gdef\@flsucceed{\@elt #1}\gdef\@flfail
  8389.   {}\@tempdima\ht #1\let\@elt\@ztryfc \@trylist \ifdim \@tempdima >\@fpmin
  8390.      \global\@fcolmadetrue \else \@cons\@failedlist #1\fi
  8391.   \endgroup \if@fcolmade \let\@elt\@gobble \fi}
  8392.  
  8393. \def\@ztryfc #1{\@tempcnta\count #1\divide\@tempcnta\@xxxii
  8394.     \multiply\@tempcnta\@xxxii \@bitor \@tempcnta {\@failedlist
  8395.     \@flfail}\@testfp #1\@tempdimb\@tempdima \advance\@tempdimb\ht #1\advance
  8396.     \@tempdimb\@fpsep \ifdim \@tempdimb >\@colht \global\@testtrue\fi
  8397.     \if@test \@cons\@flfail #1\else \@cons\@flsucceed #1\@tempdima\@tempdimb
  8398.     \fi}
  8399.  
  8400. \def\@testfp #1{\@tempcnta\count #1\divide\@tempcnta 8\relax
  8401.    \ifodd\@tempcnta \else \global\@testtrue\fi}
  8402.  
  8403. \def\@makefcolumn #1{\begingroup  \@fpmin\z@ \let\@testfp\@gobble
  8404.    \@tryfcolumn #1\endgroup}
  8405.  
  8406. \def\@addtobot{\@tempcnta\count\@currbox\divide\@tempcnta4 \ifodd\@tempcnta
  8407.    \ifnum \@botnum >\z@ \ifdim \@botroom >\ht\@currbox
  8408.     \global\advance\@botnum\m@ne
  8409.     \global\advance\@colnum\m@ne
  8410.     \@tempdima -\ht\@currbox
  8411.     \advance\@tempdima -\ifx\@botlist\@empty \textfloatsep
  8412.        \else\floatsep\fi
  8413.     \global\advance\@botroom \@tempdima
  8414.     \global\advance\@colroom \@tempdima
  8415.     \@cons\@botlist\@currbox \global\maxdepth\z@
  8416.     \@inserttrue\fi\fi\fi}
  8417.  
  8418. \def\@addtotoporbot{\@tempcnta\count\@currbox \divide\@tempcnta\tw@
  8419.    \ifodd\@tempcnta \ifnum \@topnum >\z@ \ifdim\@toproom >\ht\@currbox
  8420.      \@bitor\@currtype{\@midlist\@botlist}\if@test\else
  8421.         \global\advance\@topnum\m@ne
  8422.         \global\advance\@colnum\m@ne
  8423.         \@tempdima-\ht\@currbox
  8424.         \advance\@tempdima
  8425.            -\ifx\@toplist\@empty \textfloatsep \else\floatsep\fi
  8426.         \global\advance\@toproom \@tempdima
  8427.         \global\advance\@colroom \@tempdima
  8428.         \@cons\@toplist\@currbox
  8429.         \@inserttrue
  8430. \fi\fi\fi\fi
  8431. \if@insert\else\@addtobot \fi}
  8432.  
  8433. \def\@addtonextcol{\@insertfalse \@textmin \textfraction\@colht
  8434.    \@tempdima\ht\@currbox
  8435.    \advance\@tempdima\@textmin\advance\@tempdima\@maxsep
  8436.    \ifdim\@colroom >\@tempdima
  8437.      \ifnum\@colnum >\z@
  8438.         \@currtype\count\@currbox \divide\@currtype\@xxxii
  8439.         \multiply\@currtype\@xxxii
  8440.         \@bitor\@currtype\@deferlist
  8441.         \if@test\else
  8442.           \@addtotoporbot
  8443.     \fi\fi\fi
  8444.     \if@insert\else \@cons\@deferlist\@currbox\fi}
  8445.  
  8446. \def\@addtodblcol{\@insertfalse
  8447.    \@tempcnta\count\@currbox \divide\@tempcnta\tw@
  8448.    \ifodd\@tempcnta
  8449.       \ifnum\@dbltopnum >\z@
  8450.          \ifdim\@dbltoproom >\ht\@currbox
  8451.            \@currtype\count\@currbox \divide\@currtype\@xxxii
  8452.                \multiply\@currtype\@xxxii
  8453.            \@bitor\@currtype\@dbldeferlist
  8454.            \if@test\else
  8455.               \global\advance\@dbltopnum\m@ne
  8456.               \@tempdima -\ht\@currbox
  8457.               \advance\@tempdima -\ifx\@dbltoplist\@empty
  8458.                  \dbltextfloatsep\else\dblfloatsep\fi
  8459.               \global\advance\@dbltoproom \@tempdima
  8460.               \global\advance\@colht \@tempdima
  8461.               \@cons\@dbltoplist\@currbox
  8462.               \@inserttrue
  8463.    \fi\fi\fi\fi
  8464.    \if@insert\else \@cons\@dbldeferlist\@currbox \fi}
  8465.  
  8466. % CHANGE TO \@addtocurcol:
  8467. % \penalty\z@ changed to \penalty\interlinepenalty so \samepage
  8468. % works properly with figure and table environments.
  8469. % (Changed 23 Oct 86)
  8470. %
  8471. \def\@addtocurcol{\@insertfalse \@textmin \textfraction\@colht
  8472.    \@tempdima\@pageht \advance\@tempdima\@pagedp
  8473.    \ifdim \@textmin > \@tempdima \@tempdima\@textmin \fi
  8474.        \advance\@tempdima\ht\@currbox \advance\@tempdima\@maxsep
  8475.    \ifdim\@colroom >\@tempdima
  8476.       \ifnum\@colnum >\z@
  8477.          \@currtype\count\@currbox \divide\@currtype\@xxxii
  8478.                 \multiply\@currtype\@xxxii
  8479.          \@bitor\@currtype\@deferlist
  8480.          \if@test\else
  8481.             \@bitor\@currtype\@botlist
  8482.             \if@test \@addtobot \else
  8483.                \ifodd\count\@currbox
  8484.                  \global\advance\@colnum\m@ne
  8485.                  \@cons\@midlist\@currbox
  8486.                  \vskip\intextsep \box\@currbox
  8487.                  \penalty\interlinepenalty \vskip\intextsep
  8488.                  \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi
  8489.                  \outputpenalty\z@
  8490.                  \@inserttrue
  8491.                \else \@addtotoporbot
  8492.    \fi\fi\fi\fi\fi
  8493.    \if@insert\else\@cons\@deferlist\@currbox\fi}
  8494.  
  8495. \def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox
  8496.     \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
  8497.     \if@twocolumn
  8498.         \if@firstcolumn \@tempcnta\m@ne \fi
  8499.     \else
  8500.       \if@mparswitch
  8501.          \ifodd\c@page \else\@tempcnta\m@ne \fi
  8502.       \fi
  8503.       \if@reversemargin \@tempcnta -\@tempcnta \fi
  8504.     \fi
  8505.     \ifnum\@tempcnta <\z@  \global\setbox\@marbox\box\@currbox \fi
  8506.     \@tempdima\@mparbottom \advance\@tempdima -\@pageht
  8507.        \advance\@tempdima\ht\@marbox \ifdim\@tempdima >\z@
  8508.        \@warning{Marginpar on page \thepage\space moved}\else\@tempdima\z@ \fi
  8509.     \global\@mparbottom\@pageht \global\advance\@mparbottom\@tempdima
  8510.        \global\advance\@mparbottom\dp\@marbox
  8511.        \global\advance\@mparbottom\marginparpush
  8512.     \advance\@tempdima -\ht\@marbox
  8513.     \global\ht\@marbox\z@ \global\dp\@marbox\z@
  8514.     \vskip -\@pagedp \vskip\@tempdima\nointerlineskip
  8515.     \hbox to\columnwidth
  8516.       {\ifnum \@tempcnta >\z@
  8517.           \hskip\columnwidth \hskip\marginparsep
  8518.         \else \hskip -\marginparsep \hskip -\marginparwidth \fi
  8519.        \box\@marbox \hss}%
  8520.     \vskip -\@tempdima
  8521.     \nointerlineskip
  8522.     \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}}
  8523.  
  8524.  \message{debugging}
  8525. %     ****************************************
  8526. %     * DEBUGGING AND TEST INITIALIZATIONS  *
  8527. %     ****************************************
  8528. %
  8529. % DEBUGGING
  8530. \def\showoverfull{\tracingonline=1}
  8531. \tracingstats1   % SHOWS HOW MUCH STUFF TeX HAS USED
  8532. \def\showoutput{\tracingonline1\tracingoutput1
  8533.     \showboxbreadth99999\showboxdepth99999\errorstopmode}
  8534. \def\makeatletter{\catcode`\@=11\relax}
  8535. \def\makeatother{\catcode`\@=12\relax}
  8536.  
  8537. \newcount\@lowpenalty
  8538. \newcount\@medpenalty
  8539. \newcount\@highpenalty
  8540.  
  8541. % LIST
  8542.  
  8543. % ENUMERATION
  8544.  
  8545. % ITEMIZE
  8546.  
  8547. % ARRAY AND TABULAR
  8548.  
  8549. % THE PICTURE ENVIRONMENT
  8550.  
  8551. \unitlength = 1pt
  8552. \fboxsep = 3pt
  8553. \fboxrule = .4pt
  8554.  
  8555. %% FOOTNOTES
  8556.  
  8557. %\def\footnoterule{}  % INITIALIZED BY PLAIN
  8558. %\skip\footins{}      % INITIALIZED BY PLAIN
  8559. %\interfootnotelinepenalty % INITIALIZED BY PLAIN
  8560.  
  8561. \@maxdepth       = \maxdepth
  8562.  
  8563. % \vsize initialized because a \clearpage with \vsize < \topskip
  8564. %  causes trouble.
  8565. % \@colroom and \@colht also initialized because \vsize may be
  8566. %  set to them if a \clearpage is done before the \begin{document}
  8567.  
  8568. \vsize = 1000pt
  8569. \@colroom = \vsize
  8570. \@colht = \vsize
  8571.  
  8572. % -eof-
  8573.